C# EF框架 頻繁連接性能損耗


目的

測試EF框架在一次連接中多次保存和多次連接的耗時對比

測試環境

  • 數據庫SqlServer 2012 R2
  • EF框架6.2.0版本

數據庫內容

ID UserName Password CreateTime
1 111 123 2019-07-17 12:12:12
2 222 123 2019-07-17 12:12:12

代碼

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EFConnectTest
{
    class Program
    {
        static void Main(string[] args)
        {
            for(int i=1; i<=10; i++)
            {
                var task1 = Task.Factory.StartNew<long>(Connect1);
                task1.Wait();
                Console.WriteLine(string.Format("第{0}次測試,連接一次的情況下耗時{1}ms", i, task1.Result));

                var task2 = Task.Factory.StartNew<long>(Connect2);
                task2.Wait();
                Console.WriteLine(string.Format("第{0}次測試,連接多次的情況下耗時{1}ms", i, task2.Result));

                Console.WriteLine(string.Format("平均每次連接多耗時{0}ms{1}", (double)(task2.Result - task1.Result) / Count, Environment.NewLine));
            }
            Console.ReadLine();
        }

        /// <summary>
        /// 執行次數
        /// </summary>
        private static int Count = 1000;

        public static long Connect1()
        {
            Stopwatch sw = new Stopwatch();
            sw.Restart();

            using (TestEntities dbContext = new TestEntities())
            {
                var i = 0;
                while (i < Count)
                {
                    var userList = dbContext.User.ToList();
                    foreach (var user in userList)
                    {
                        user.UserName = i.ToString();
                    }
                    i++;
                    dbContext.SaveChanges();
                }
            }
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }

        public static long Connect2()
        {
            Stopwatch sw = new Stopwatch();
            sw.Restart();

            var i = 0;
            while (i < 1000)
            {
                using (TestEntities dbContext = new TestEntities())
                {
                    var userList = dbContext.User.ToList();
                    foreach (var user in userList)
                    {
                        user.UserName = i.ToString();
                    }
                    i++;
                    dbContext.SaveChanges();
                }
            }
            sw.Stop();
            return sw.ElapsedMilliseconds;
        }
    }
}

測試結果

第1次測試,連接一次的情況下耗時7150ms
第1次測試,連接多次的情況下耗時4912ms
平均每次連接多耗時-2.238ms

第2次測試,連接一次的情況下耗時4518ms
第2次測試,連接多次的情況下耗時5217ms
平均每次連接多耗時0.699ms

第3次測試,連接一次的情況下耗時4548ms
第3次測試,連接多次的情況下耗時5719ms
平均每次連接多耗時1.171ms

第4次測試,連接一次的情況下耗時4137ms
第4次測試,連接多次的情況下耗時5456ms
平均每次連接多耗時1.319ms

第5次測試,連接一次的情況下耗時4136ms
第5次測試,連接多次的情況下耗時5771ms
平均每次連接多耗時1.635ms

第6次測試,連接一次的情況下耗時4237ms
第6次測試,連接多次的情況下耗時5570ms
平均每次連接多耗時1.333ms

第7次測試,連接一次的情況下耗時4233ms
第7次測試,連接多次的情況下耗時5109ms
平均每次連接多耗時0.876ms

第8次測試,連接一次的情況下耗時4746ms
第8次測試,連接多次的情況下耗時5132ms
平均每次連接多耗時0.386ms

第9次測試,連接一次的情況下耗時4797ms
第9次測試,連接多次的情況下耗時5033ms
平均每次連接多耗時0.236ms

第10次測試,連接一次的情況下耗時4342ms
第10次測試,連接多次的情況下耗時5209ms
平均每次連接多耗時0.867ms

結果分析

第一次測試由於首次連接數據庫結果不准,使用其他9組測試數據進行耗時分析

每次連接的多耗時0.937ms


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM