日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第八节: EF的性能篇(一) 之 EF自有方法的性能测试

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第八节: EF的性能篇(一) 之 EF自有方法的性能测试 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一. 開發中常見的性能問題

?  我們在日常開發過程中,由于一些不好的習慣,經常會導致所寫的代碼性能低下,卻毫無發覺,下面就總結一下常見的一些性能問題。

1. 真假分頁

  ① 假分頁:?db.xxx.toList().Skip(2).take(4) 。

  ?② 真分頁:db.xxx.Skip(2).take(3).toList() 。

2. 合理的使用EF的數據加載方式

?  EF的加載方式有:立即加載、延遲加載、顯示加載。

  詳見:

    ①:?第五節: EF高級屬性(一) 之 本地緩存、立即加載、延遲加載(不含導航屬性)

    ②:?第六節: EF高級屬性(二)?之延遲加載、立即加載、顯示加載(含導航屬性)。

?

3. NoTracking的使用

?  EF查詢出來的實體,默認是跟蹤狀態的,如果查詢出來的實體不需要修改或者刪除,查詢的時候可以刪除狀態跟蹤,變為Detached狀態,來提高性能。

  ? 關于EF狀態的跟蹤,詳見后面章節,敬請期待!!

1 using (DbContext context = new MyDbContext()) 2 { 3 var people = context.Student.Where(p => p.Id > 2).AsNoTracking().ToList(); 4 }

4. 合理的使用SQL事務

  將與事務無關的一些SQL語句放到事務外,如果一個事務中的SQL語句過長,很容易出現死鎖問題,壓力測試時,出現資源被鎖的錯誤。

?

二. 關于EF數據操作的性能問題

?  EF自誕生以來,大批量的操作增加、刪除、修改操作數據效率一直很低,1000條數據以內,效率尚且可以接受(10s內),但隨著數據量逐漸增大,很容易在執行的過程中就宕機了,相當尷尬。在本章節,我們一起來測試一下,EF在不進行任何優化的情況下,幾種寫法的效率問題。

  我們這里的測試是以增加數據為例,先把測試的三種寫法的結論貼上。

1.?每添加1條數據,savechange一下(小白常犯的錯誤,堅決抵制這種做法!!)

1     private static void NewMethod1(DbContext db)2 {3 Console.WriteLine("-------------1. 每添加1條數據,savechange一下(小白常犯的錯誤,堅決抵制這種做法!!)-------------------");4 Stopwatch watch = Stopwatch.StartNew();5 for (int i = 0; i < 1000; i++)6 {7 TestOne t = new TestOne();8 t.id = Guid.NewGuid().ToString("N");9 t.t1 = "t1+" + i; 10 t.t1 = "t2+" + i; 11 db.Set<TestOne>().Add(t); 12 db.SaveChanges(); 13 } 14 watch.Stop(); 15 Console.WriteLine("1000條數據耗時:{0}", watch.ElapsedMilliseconds); 16 }

2.?先將所有數據添加到內存里,最后再savechange

1 private static void NewMethod2(DbContext db, int count)2 {3 Console.WriteLine("-------------2. 先將所有數據添加到內存里,最后再savechange-------------------");4 Stopwatch watch = Stopwatch.StartNew();5 for (int i = 0; i < count; i++)6 {7 TestOne t = new TestOne();8 t.id = Guid.NewGuid().ToString("N");9 t.t1 = "t1+" + i; 10 t.t1 = "t2+" + i; 11 db.Set<TestOne>().Add(t); 12 } 13 db.SaveChanges(); 14 watch.Stop(); 15 Console.WriteLine("{0}條數據耗時:{1}", count, watch.ElapsedMilliseconds); 16 }

3.?使用addRange方法,先將數據加到list集合中,然后一次性通過addRange加到內存里

1 private static void NewMethod3(DbContext db, int count)2 {3 Console.WriteLine("-------------3. 使用addRange方法,先將數據加到list集合中,然后一次性通過addRange加到內存里-------------------");4 Stopwatch watch = Stopwatch.StartNew();5 List<TestOne> tList = new List<TestOne>();6 for (int i = 0; i < count; i++)7 {8 TestOne t = new TestOne();9 t.id = Guid.NewGuid().ToString("N"); 10 t.t1 = "t1+" + i; 11 t.t1 = "t2+" + i; 12 tList.Add(t); 13 } 14 db.Set<TestOne>().AddRange(tList); 15 db.SaveChanges(); 16 watch.Stop(); 17 Console.WriteLine("{0}條數據耗時:{1}", count, watch.ElapsedMilliseconds); 18 }

?

?  總結:EF自有的方法,三個階段如上,數據超過1000條,性能直線下降,那么怎么來解決EF處理大數據量的性能問題呢?敬請期待下一個章節:???第九節: EF的性能篇(二) 之 Z.EntityFramework.Extensions程序集解決EF的性能問題

總結

以上是生活随笔為你收集整理的第八节: EF的性能篇(一) 之 EF自有方法的性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。