成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

對(duì)《LINQ能不能用系列1數(shù)組篩選效率對(duì)比》的幾個(gè)問題

開發(fā) 后端
我們看到了一個(gè)討論LINQ到底能不能用的系列文章,但也同時(shí)看到了一篇反駁的文章。特同時(shí)發(fā)布,供大家討論。

引用原文:LINQ能不能用系列(一)數(shù)組篩選效率對(duì)比

錯(cuò)誤一:作為對(duì)比測(cè)試,測(cè)試數(shù)組應(yīng)該為同一個(gè),否則測(cè)試數(shù)據(jù)沒有可比性

錯(cuò)誤二:對(duì)比組中對(duì)List的使用不對(duì),List默認(rèn)創(chuàng)建的數(shù)組大小為4,每次增長為4,那么這里就會(huì)反復(fù)重新創(chuàng)建新的數(shù)組次數(shù)為log10000000次左右當(dāng)然會(huì)比Linq慢很多

錯(cuò)誤三:面對(duì)Linq接近0毫秒的處理能力,稍微有點(diǎn)經(jīng)驗(yàn)的同學(xué)就知道這是不可能的,除非是很強(qiáng)很強(qiáng)的計(jì)算機(jī),至于為什么后面給出答案,總之linq查詢里肯定有貓膩,直接調(diào)用tolist()強(qiáng)制返回結(jié)果再說;//這里Stone W在評(píng)論中對(duì)ToList有質(zhì)疑,我之所以ToList是為了和第二組進(jìn)行對(duì)比,因?yàn)榈诙M得到的結(jié)果是一個(gè)List,我很奇怪,這次的對(duì)比測(cè)試到底是為了測(cè)試得到兩個(gè)結(jié)果集的算法對(duì)比呢還是測(cè)試Count算法的對(duì)比呢?如果是前者,一個(gè)拿到的是IEnumerable的對(duì)象一個(gè)是List對(duì)象,牛跟鬧鐘怎么對(duì)比哪個(gè)跑的快呢?也只有在調(diào)用ToList的時(shí)候才會(huì)真正執(zhí)行Linq的算法也就是下面的嵌套類WhereListIterator;當(dāng)然如果是為了進(jìn)行Count對(duì)比的話那么對(duì)比組二中的算法真的有點(diǎn)拙劣,我想不會(huì)有誰會(huì)用方法二來統(tǒng)計(jì)。

下面是修改了如上三個(gè)明顯錯(cuò)誤后的代碼,如果哪位同學(xué)有補(bǔ)充歡迎留言:

  1. [Fact]  
  2. public void LinqTest()  
  3. {  
  4.     TestLinq(1);  
  5.     TestLinq(2);  
  6.     TestLinq(3);  
  7. }  
  8.  
  9. public void TestLinq(int time)  
  10. {  
  11.     const int listCount = 10000000; // 數(shù)組長度  
  12.     Random random = new Random(); // 數(shù)據(jù)隨機(jī)構(gòu)建值  
  13.  
  14.     // 數(shù)組構(gòu)建   
  15.     List<int> list1 = new List<int>();  
  16.     for (int i = 0; i < listCount; i++)  
  17.     {  
  18.         list1.Add(random.Next(10000));  
  19.     }  
  20.  
  21.     // 效率測(cè)試內(nèi)容:提取數(shù)組中數(shù)值大于的100的數(shù)組  
  22.  
  23.     // LINQ 測(cè)試  
  24.     Stopwatch linq_Stopwatch = new Stopwatch();  
  25.     linq_Stopwatch.Start();  
  26.  
  27.     var linqList = (from num in list1  
  28.                     where num > 100  
  29.                     select num).ToList();  
  30.     linq_Stopwatch.Stop();  
  31.     // 普通方式 測(cè)試  
  32.     Stopwatch before_Stopwatch = new Stopwatch();  
  33.     before_Stopwatch.Start();  
  34.  
  35.     List<int> beforeList = new List<int>(10000000);  
  36.     for (int i = 0; i < list1.Count(); i++)  
  37.     {  
  38.         if (list1[i] > 100)  
  39.             beforeList.Add(list1[i]);  
  40.     }  
  41.     before_Stopwatch.Stop();  
  42.  
  43.  
  44.     Console.WriteLine(  
  45.         String.Format("第{0}次測(cè)試,測(cè)試:{5}條數(shù)據(jù)。\n\r \t LINQ用時(shí):{1}毫秒,篩選了{(lán)2}條數(shù)據(jù)。\n\r\t 普通用時(shí):{3}毫秒,篩選了{(lán)4}條數(shù)據(jù)。\r\n",  
  46.                       time, linq_Stopwatch.ElapsedMilliseconds, linqList.Count(),  
  47.                       before_Stopwatch.ElapsedMilliseconds, beforeList.Count(), listCount));  
  48.  

測(cè)試結(jié)果:

第1次測(cè)試,測(cè)試:10000000條數(shù)據(jù)。

LINQ用時(shí):448毫秒,篩選了9898832條數(shù)據(jù)。
普通用時(shí):437毫秒,篩選了9898832條數(shù)據(jù)。

第2次測(cè)試,測(cè)試:10000000條數(shù)據(jù)。

LINQ用時(shí):516毫秒,篩選了9899569條數(shù)據(jù)。
普通用時(shí):460毫秒,篩選了9899569條數(shù)據(jù)。

第3次測(cè)試,測(cè)試:10000000條數(shù)據(jù)。

LINQ用時(shí):608毫秒,篩選了9899231條數(shù)據(jù)。
普通用時(shí):470毫秒,篩選了9899231條數(shù)據(jù)。

結(jié)論:LINQ在實(shí)現(xiàn)靈活性提高編寫效率的時(shí)候犧牲了一定的性能,當(dāng)然這個(gè)是必須的,有的必有失嘛。

我的選擇:絕大部分時(shí)候使用Linq,在對(duì)性能要求高的時(shí)候使用普通的迭代;

 0毫秒的秘密:

  1. var linqList = (from num in list1 where num > 100 select num) 

先看看這個(gè)LinqList的類型(Console.WriteLine(linqList.GetType().FullName);):System.Linq.Enumerable+WhereListIterator`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

可以看到這是一個(gè)嵌套類,作用是對(duì)Where 條件進(jìn)行迭代操作,貼上它的源代碼:

  1. ?class WhereListIterator<TSource> : Iterator<TSource>  {      
  2.  List<TSource> source;       
  3. Func<TSource, bool> predicate;     List<TSource>.Enumerator enumerator;       
  4.   public WhereListIterator(List<TSource> source, Func<TSource, bool> predicate) {            
  5. this.source = source;           
  6.  this.predicate = predicate;      
  7.  }        
  8.  public override Iterator<TSource> Clone() {         return new WhereListIterator<TSource>(source, predicate);      
  9.  }       
  10.   public override bool MoveNext() {          switch (state) {              case 1:                 enumerator = source.GetEnumerator();                  state = 2;             
  11.       goto case 2;        
  12.        case 2:             
  13.       while (enumerator.MoveNext()) {                     
  14.    TSource item = enumerator.Current;                    
  15.    if (predicate(item)) {                          current = item;                      
  16.       return true;      
  17.                  }           
  18.          }               
  19.     Dispose();            
  20.        break;         }        
  21.     return false;     }   
  22.       public override IEnumerable<TResult> Select<TResult>(Func<TSource, TResult> selector) {          
  23.  return new WhereSelectListIterator<TSource, TResult>(source, predicate, selector);      }    
  24.     public override IEnumerable<TSource> Where(Func<TSource, bool> predicate) {       
  25.     return new WhereListIterator<TSource>(source, CombinePredicates(this.predicate, predicate));     
  26.    } }  

真相大白于天下。   

ps:下面是原文代碼的截圖

原文鏈接:http://www.cnblogs.com/jinzhao/archive/2012/05/08/2490543.html

【編輯推薦】
 

  1. Linq to xml操作XML
  2. XML之父解讀未來互聯(lián)網(wǎng)"游戲化"的三個(gè)真諦
  3. Ajax和Web服務(wù)數(shù)據(jù)格式:XML SOAP HTML
  4. 超強(qiáng)解析XML——簡(jiǎn)單直接的來
  5. 解析PHP中的XML數(shù)據(jù) 

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2012-05-09 09:55:17

LINQ

2021-05-18 12:35:00

Divdom產(chǎn)品經(jīng)理

2021-10-12 00:04:24

腳本備份MariDB

2019-11-21 09:25:23

AI 數(shù)據(jù)人工智能

2010-04-13 10:02:16

索引

2016-05-19 17:10:27

銀行

2021-02-26 21:25:08

比特幣投資貨幣

2022-10-20 08:00:37

機(jī)器人ZadigChatOps

2020-10-16 18:33:18

Rust語言前端開發(fā)

2013-04-19 10:42:02

打車軟件大數(shù)據(jù)

2025-04-22 08:00:00

2013-05-06 15:42:49

2009-09-07 14:39:14

2010-06-09 16:57:14

路由選擇協(xié)議

2011-07-01 09:31:49

.net

2011-05-18 11:31:56

數(shù)據(jù)安全數(shù)據(jù)備份

2021-03-03 21:24:57

數(shù)據(jù)倉庫工具

2023-04-06 06:55:24

ChatGPTGPT算力

2022-04-24 11:52:04

元宇宙Web3去中心化

2012-06-13 11:01:59

英特爾
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: www.4虎影院| 国产高清在线精品一区二区三区 | 伊人二区 | 成人亚洲| 精品一级 | 日韩福利| 福利片在线观看 | 女女爱爱视频 | 国产情侣久久 | 欧美一区二区三区 | 第四色影音先锋 | 日韩欧美成人精品 | 久久国产一区二区三区 | 午夜精品影院 | 欧美久久精品一级c片 | www.午夜 | 一区二区三区中文字幕 | 四虎影视一区二区 | 亚洲一区二区三区欧美 | 91精品国产综合久久国产大片 | 国产精品夜间视频香蕉 | 精品欧美一区二区三区免费观看 | japanhd成人| 国产片淫级awww | 久久精品免费观看 | 伊人一区 | 久久久999成人 | 久久精品国产一区老色匹 | 日韩在线视频免费观看 | 国产精品免费福利 | 一级a性色生活片久久毛片 午夜精品在线观看 | 亚洲成人网在线 | 婷婷激情综合 | av片网| 在线观看特色大片免费网站 | 伦理午夜电影免费观看 | 亚洲一区中文字幕 | 亚洲国产成人精品女人久久久 | 久久人操| 视频一区二区中文字幕 | 国产三级 |