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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

一. 開發(fā)中常見的性能問題

?  我們在日常開發(fā)過程中,由于一些不好的習(xí)慣,經(jīng)常會導(dǎo)致所寫的代碼性能低下,卻毫無發(fā)覺,下面就總結(jié)一下常見的一些性能問題。

1. 真假分頁

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

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

2. 合理的使用EF的數(shù)據(jù)加載方式

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

  詳見:

   ?、?#xff1a;?第五節(jié): EF高級屬性(一) 之 本地緩存、立即加載、延遲加載(不含導(dǎo)航屬性)

   ?、?#xff1a;?第六節(jié): EF高級屬性(二)?之延遲加載、立即加載、顯示加載(含導(dǎo)航屬性)。

?

3. NoTracking的使用

?  EF查詢出來的實(shí)體,默認(rèn)是跟蹤狀態(tài)的,如果查詢出來的實(shí)體不需要修改或者刪除,查詢的時候可以刪除狀態(tài)跟蹤,變?yōu)镈etached狀態(tài),來提高性能。

  ? 關(guān)于EF狀態(tài)的跟蹤,詳見后面章節(jié),敬請期待!!

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

4. 合理的使用SQL事務(wù)

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

?

二. 關(guān)于EF數(shù)據(jù)操作的性能問題

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

  我們這里的測試是以增加數(shù)據(jù)為例,先把測試的三種寫法的結(jié)論貼上。

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

1     private static void NewMethod1(DbContext db)2 {3 Console.WriteLine("-------------1. 每添加1條數(shù)據(jù),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條數(shù)據(jù)耗時:{0}", watch.ElapsedMilliseconds); 16 }

2.?先將所有數(shù)據(jù)添加到內(nèi)存里,最后再savechange

1 private static void NewMethod2(DbContext db, int count)2 {3 Console.WriteLine("-------------2. 先將所有數(shù)據(jù)添加到內(nèi)存里,最后再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}條數(shù)據(jù)耗時:{1}", count, watch.ElapsedMilliseconds); 16 }

3.?使用addRange方法,先將數(shù)據(jù)加到list集合中,然后一次性通過addRange加到內(nèi)存里

1 private static void NewMethod3(DbContext db, int count)2 {3 Console.WriteLine("-------------3. 使用addRange方法,先將數(shù)據(jù)加到list集合中,然后一次性通過addRange加到內(nèi)存里-------------------");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}條數(shù)據(jù)耗時:{1}", count, watch.ElapsedMilliseconds); 18 }

?

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。