測試EntityFramework,Z.EntityFramework.Extensions,原生語句在不同的查詢中的表現。原來池化與非池化設定是有巨大的影響的。

来源:http://www.cnblogs.com/atwind/archive/2016/08/05/5740196.html
-Advertisement-
Play Games

Insert測試,只測試1000條的情況,多了在實際的項目中應該就要另行處理了。 using System; using System.Collections.Generic; using System.Configuration; using System.Data.Entity; using S ...


Insert測試,只測試1000條的情況,多了在實際的項目中應該就要另行處理了。

 

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Diagnostics;
using System.Linq;
using EE.Service.DbAccess;
using EE.Service.DbEntity;
using EntityFramework.Extensions;
using EntityFramework.Future;
using MySql.Data.MySqlClient;

namespace EE.Services.ConsoleTest.DbAccessTests
{
    public class EFPerformanceTest
    {
        public static void Run()
        {
            //InsertTest();

            UpdateTests();
        }



        #region UpdateTest()

        static void UpdateTests()
        {
            var list = new List<SmsLog>();
            for (int i = 0; i < 1000; i++)
            {
                list.Add(new SmsLog() { Id = i, AppId = $"{i}_", CreateTime = DateTime.Now });
            }
            var sw = new Stopwatch();
            Watcher(sw, EFInit, list.GetRange(0, 10));

            Watcher(sw, MySqlSelect, list);

            Watcher(sw, EFSelect,list);



            Watcher(sw, MySqlUpdate, list);

            Watcher(sw, EFBulkUpdate, AddRangeId(list));

            Watcher(sw, EFUpdateWithNoState, AddRangeId(list));

            Watcher(sw, EFUpdate, AddRangeId(list));

        }

        static IEnumerable<SmsLog> AddRangeId(IEnumerable<SmsLog> logs)
        {
            foreach (var log in logs)
            {
                log.Id += 1000;
            }
            return logs;
        }

        static int EFSelect(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                var val = 0;
                foreach (var item in items)
                {
                    var rst = (from tb in db.SmsLogs where tb.Id == 1 select tb).FirstOrDefault();
                    if (rst != null) val++;
                }
                return val;
            }
        }

        static int EFUpdate(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                foreach (var item in items)
                {
                    //db.SmsLogs.Attach(item);
                    var o = db.SmsLogs.Where(x => x.Id == item.Id).FirstOrDefault();
                    if (o == null) continue;
                    o.AppId = item.AppId+"U";
                    o.CreateTime = item.CreateTime;
                }
                var val = db.SaveChanges();
                return val;
            }
        }

        static int EFUpdateWithNoState(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                db.Configuration.AutoDetectChangesEnabled = false;
                db.Configuration.ValidateOnSaveEnabled = false;
                db.Configuration.LazyLoadingEnabled = false;
                db.Configuration.ProxyCreationEnabled = false;
                var val = 0;
                foreach (var item in items)
                {
                    //傳統更新方式 .. 更新不了(沒有狀態,無法完成更新)
                    var o = db.SmsLogs.Where(x => x.Id == item.Id).FirstOrDefault();
                    if (o == null) continue;
                    o.AppId = item.AppId+"SU";
                    o.CreateTime = item.CreateTime;
                }
                val = db.SaveChanges();
                return val;
            }
        }

        static int EFBulkUpdate(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                foreach (var item in items)
                {
                    var o = db.SmsLogs.Where(x => x.Id == item.Id).FirstOrDefault();
                    if (o == null) continue;
                    o.AppId = item.AppId+"BU";
                    o.CreateTime = item.CreateTime;
                }
                db.BulkSaveChanges();
                return 0;
            }
        }

        static int MySqlUpdate(IEnumerable<SmsLog> items)
        {
            var val = 0;
            var connStr = ConfigurationManager.ConnectionStrings["EEServiceLogDb"].ConnectionString;
            using (var conn = new MySqlConnection(connStr))
            {
                conn.Open();
                foreach (var item in items)
                {
                    val += MySqlHelper.ExecuteNonQuery(conn, "Update SmsLogs set AppId=@appId,CreateTime=@createTime where Id = @id;", new MySqlParameter("@appId", item.AppId+"S"), new MySqlParameter("@createTime", item.CreateTime), new MySqlParameter("@id", item.Id));
                }
                conn.Close();
            }
            return val;
        }
        static int MySqlSelect(IEnumerable<SmsLog> items)
        {
            var val = 0;
            var connStr = ConfigurationManager.ConnectionStrings["EEServiceLogDb"].ConnectionString;
            using (var conn = new MySqlConnection(connStr))
            {
                conn.Open();
                foreach (var item in items)
                {
                    var dr = MySqlHelper.ExecuteReader(conn, "select * from SmsLogs where Id = @id;", new[] { new MySqlParameter("@id", item.Id) });
                    while (dr.Read())
                    {
                        val += 1;
                    }
                    dr.Close();
                }
                conn.Close();
            }
            return val;
        }



        #endregion



        #region InsertTest()


        static void InsertTest()
        {
            var list = new List<SmsLog>();
            for (int i = 0; i < 1000; i++)
            {
                list.Add(new SmsLog() { AppId = $"{i}", CreateTime = DateTime.Now });
            }
            var sw = new Stopwatch();

            Watcher(sw, EFInit, list.GetRange(0, 10));
            Watcher(sw, EFBulkInsert, list);
            Watcher(sw, EFInsertWithNoState, list);
            Watcher(sw, EFInsert, list);
            Watcher(sw, MySqlInsert, list);
            //Watcher(sw, EFInsert, list);

        }


        static int EFInsert(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                foreach (var item in items)
                    db.SmsLogs.Add(item);

                var val = db.SaveChanges();
                return val;
            }
        }

        static int EFInsertWithNoState(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                db.Configuration.AutoDetectChangesEnabled = false;
                db.Configuration.ValidateOnSaveEnabled = false;
                db.Configuration.LazyLoadingEnabled = false;
                db.Configuration.ProxyCreationEnabled = false;

                foreach (var item in items)
                    db.SmsLogs.Add(item);

                var val = db.SaveChanges();
                return val;
            }
        }

        static int EFBulkInsert(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                //db.Configuration.AutoDetectChangesEnabled = false;
                //db.Configuration.ValidateOnSaveEnabled = false;
                foreach (var item in items)
                    db.SmsLogs.Add(item);

                db.BulkSaveChanges();
                return 0;
            }
        }

        static int MySqlInsert(IEnumerable<SmsLog> items)
        {
            var val = 0;
            var connStr = ConfigurationManager.ConnectionStrings["EEServiceLogDb"].ConnectionString;
            using (var conn = new MySqlConnection(connStr))
            {
                conn.Open();
                foreach (var item in items)
                {
                    val += MySqlHelper.ExecuteNonQuery(conn, "Insert into SmsLogs(AppId,CreateTime)values(@appId,@createTime)", new MySqlParameter("@appId", item.AppId), new MySqlParameter("@createTime", item.CreateTime));
                }
                conn.Close();
            }
            return val;
        }


        #endregion



        /// <summary>
        /// 初始化一下,儘量減少EF初始化時間的影響
        /// </summary>
        /// <param name="items"></param>
        /// <returns></returns>
        static int EFInit(IEnumerable<SmsLog> items)
        {
            using (var db = new ServiceLogDbContent())
            {
                foreach (var item in items)
                {
                    var o = db.SmsLogs.FirstOrDefault(x => x.Id == item.Id);
                    if (o != null)
                    {
                        o.AppId = "Init";
                    }
                }
                var val = db.SaveChanges();
                return val;
            }
        }

        static void Watcher<T>(Stopwatch stopwatch, Func<IEnumerable<T>, int> func, IEnumerable<T> list)
        {
            if (stopwatch == null) stopwatch = new Stopwatch();
            stopwatch.Reset();
            Console.WriteLine($"[{DateTime.Now:HH:mm:ss ffffff}] {func.Method.Name} BEGIN =====================================================");
            stopwatch.Start();
            var val = func(list);
            stopwatch.Stop();
            Console.WriteLine($"[{DateTime.Now:HH:mm:ss ffffff}] {func.Method.Name}[{stopwatch.Elapsed}  IN<{list.Count()}> -> RS<{val}>]");
            //Console.WriteLine($"[{DateTime.Now:HH:mm:ss ffffff}] {func.Method.Name} end");
        }

    }
}
View Code

 

 

本機開發機,DB在內網伺服器上。測試結果:

可以看到,EF的初始執行還是蠻耗時間的。擴展的BuilInsert要比迴圈的MySqlInsert語句效率還好一些。關掉狀態跟蹤與預設情況,差別不大(不知是不是我寫的有問題)。

 

 

這麼一看,是因為查詢慢嗎?

更新的方式就是選Where出對象,再修改對象的值,再SaveChagnes。 難道是我寫的方式不對?為什麼查詢這麼慢?

 -----------------------------------------------------------------------------------------------------------------------------------

 

原來不是我的寫的問題,而是配置問題,連接串中沒有池化與有池化的結果相差近10倍。這算什麼???

Pooling=true;

連接串中的這個就是影響性能差別巨大的“元凶”


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 博客園有很多人發表了他們自己認為的框架,好奇,就點進去看了下。 我只想說那真的稱不上是框架。 我建議他們可以多多看.net的是如何設計的、一些第三方框架的代碼是如何寫的。拿熟悉的.net web框架的來說,從:using System; 到:using System.Web;再到:using Sys ...
  • VS2013自帶IIS Express,無法發佈JSON文件,需添加MIME映射。 沒有圖形界面,只能命令行。 進入C:\Program Files(x86)\IIS Express文件夾,輸入:appcmd set config /section:staticContent /+[fileExte... ...
  • 可能對於初入此行業人來說有些困惑,實現起來有一絲複雜。 比如說時間是:2016-08-05 14:46:30,中間過了56秒鐘。要求得出56秒之後的時間格式是:年月日時分秒 下麵介紹最簡單的辦法, 也就是直接用 2016-08-05 14:46:30.AddSeconds(56)即可。 其中的Add ...
  • 這次主要實現管理後臺界面用戶資料的修改和刪除,修改用戶資料和角色是經常用到的功能,但刪除用戶的情況比較少,為了功能的完整性還是坐上了。主要用到兩個action “Modify”和“Delete”。 目錄 MVC5網站開發之一 總體概述 MVC5 網站開發之二 創建項目 MVC5 網站開發之三 數據存 ...
  • 對Web API新手來說,不要忽略了ApiController 在web API中,方法的返回值如果是實體的話實際上是自動返回JSON數據的例如: 他的返回值就是這樣的: 這是定義的Response類 在web API還有一個問題,可能是我自己太大意了,新建的控制器如果沒有仔細看就會預設選擇了MVC ...
  • 一、什麼是VSTO? VSTO = Visual Studo Tools for Office,是.net平臺下的Office開發技術。相對於傳統的VBA(Visual Basic Application)開發,VSTO為中高級開發人員提供了更加強大的開發平臺和語言,並部分解決了傳統Office開發 ...
  • 為什麼要創造Taurus.MVC:記得被上一家公司忽悠去負責公司電商平臺的時候,情況是這樣的:項目原版是外包給第三方的,使用:WebForm+NHibernate,代碼不堪入目,Bug無限,經常點著點著就掛了。一開始招了幾個實習的大學生在那玩,搞不定了,終於忽悠的我了,哈哈。。。當時進去的第一感覺是... ...
  • public static void InsertWithLob(OracleConnection conn) { if (conn!= null && conn.State == ConnectionState.Open) { try { string sqlText = "insert into ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...