亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

數組排序LINQ的性能優勢初步分析 —— 不起眼的屬性

2024-07-21 02:45:12
字體:
來源:轉載
供稿:網友
話說前陣子姜敏兄對Array.Sort和Enumerable.OrderBy方法進行了一次足夠嚴密的性能測試??山Y論似乎與理論和預期不符,但這個結論卻是在一個相對嚴謹的環境下測出,也勾起了各位大牛的興趣。偶也在偶的機器上測試了一把,當然偶先把一些無關的代碼整理了一下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;



namespace Exam11
{
  public static class CodeTimer
  {


    public static void Initialize()
    {
      PRocess.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
      Thread.CurrentThread.Priority = ThreadPriority.Highest;
      Time( "", 1, () => { } );
    }


    public static void Time( string name, int iteration, Action action )
    {
      if ( String.IsNullOrEmpty( name ) ) return;
      // warm up            
      action();
      // 1.           
      ConsoleColor currentForeColor = Console.ForegroundColor;
      Console.ForegroundColor = ConsoleColor.Yellow;
      Console.WriteLine( name );
      // 2.          
      GC.Collect( GC.MaxGeneration, GCCollectionMode.Forced );
      int[] gcCounts = new int[GC.MaxGeneration + 1];
      for ( int i = 0; i <= GC.MaxGeneration; i++ )
      {
        gcCounts[i] = GC.CollectionCount( i );
      }
      // 3.         
      Stopwatch watch = new Stopwatch();
      watch.Start();
      ulong cycleCount = GetCycleCount();
      for ( int i = 0; i < iteration; i++ ) action();
      ulong cpuCycles = GetCycleCount() - cycleCount;
      watch.Stop();
      // 4.           
      Console.ForegroundColor = currentForeColor;
      Console.WriteLine( "/tTime Elapsed:/t" + watch.ElapsedMilliseconds.ToString( "N0" ) + "ms" );
      Console.WriteLine( "/tCPU Cycles:/t" + cpuCycles.ToString( "N0" ) );
      // 5.        
      for ( int i = 0; i <= GC.MaxGeneration; i++ )
      {
        int count = GC.CollectionCount( i ) - gcCounts[i];
        Console.WriteLine( "/tGen " + i + ": /t/t" + count );
      }
      Console.WriteLine();
    }
    private static ulong GetCycleCount()
    {
      ulong cycleCount = 0;
      QueryThreadCycleTime( GetCurrentThread(), ref cycleCount );
      return cycleCount;
    }
    [DllImport( "kernel32.dll" )]
    [return: MarshalAs( UnmanagedType.Bool )]
    static extern bool QueryThreadCycleTime( IntPtr threadHandle, ref ulong cycleTime );
    [DllImport( "kernel32.dll" )]
    static extern IntPtr GetCurrentThread();
  }



  class Program
  {
    static void Main( string[] args )
    {



      var random = new Random( DateTime.Now.Millisecond );
      var array = Enumerable.Repeat( 0, 50000 ).Select( _ => new Person { ID = random.Next() } ).ToArray();


      //老趙程序
      CodeTimer.Initialize();


      CodeTimer.Time( "SortWithCustomComparer", 500, () => SortWithCustomComparer( CloneArray( array ) ) );

      CodeTimer.Time( "SortWithLinq", 500, () => SortWithLinq( CloneArray( array ) ) );


      Console.ReadLine();
    }



    private static void SortWithCustomComparer( Person[] array )
    {
      Array.Sort( array, new PersonComparer() );
    }

    private static void SortWithLinq( Person[] array )
    {
      var sorted =
          ( from person in array
            orderby person.ID
            select person ).ToList();
    }

    private static T[] CloneArray<T>( T[] source )
    {
      var dest = new T[source.Length];
      Array.Copy( source, dest, source.Length );
      return dest;
    }
    
  }
  public class Person
  {
    public string FirstName
    {
      get;
      set;
    }

    public string LastName
    {
      get;
      set;
    }

    public int ID
    {
      get;
      set;
    }
  }
  public class PersonComparer : IComparer<Person>
  {
    public int Compare( Person x, Person y )
    {
      return x.ID - y.ID;
    }

  }
}


測試的結果的的確確是Enumerable.OrderBy明顯可以察覺出來的優勢,即使是在Release編譯方式下。

從原理上來說,這是不可能的,那么他們一定有什么地方存在某種不公平競爭。



我重新審視了整個代碼,調整了兩個測試代碼的位置:

CodeTimer.Time( "SortWithLinq", 100, () => SortWithLinq( CloneArray( array ) ) );

CodeTimer.Time( "SortWithCustomComparer", 100, () => SortWithCustomComparer( CloneArray( array ) ) );


當然,這不會有任何效果。其次我又發現這個comparer實例被創建了多次(其實也就100次),遂優化如下:

private static PersonComparer comparer = new PersonComparer();

private static void SortWithCustomComparer( Person[] array )
{
  Array.Sort( array, comparer );
}
對結果也沒有什么改善。

所以我只能將目光集中到comparer的實現上:

public class PersonComparer : IComparer<Person>
{
  public int Compare( Person x, Person y )
  {
    return x.ID - y.ID;
  }

}

這并不是一個公平的做法,但應該也不會引起性能問題,將其改成如下形式:

public int Compare( Person x, Person y )
{
  return x.ID.CompareTo( y.ID );
}

性能依然沒有什么改善,反而還有小幅下降(這也正常)。

似乎陷入了僵局?事實上我們已經非常接近事實的真相了,其實標題都已經將答案公布了。因為問題就出在person.ID是一個屬性,這里其實調用了三次方法。

所以只需要簡單的將ID改成一個字段,性能結果便與預期的相近了。

那么在這里,LINQ為什么會有優勢呢?啊,如果你了解LINQ的排序原理,其實不難想到,LINQ可以節省很多次Person.get_ID的調用。我相信這個分析,會在大牛的下一篇文章詳細闡述的,我就不在這里獻丑了。



所以結論也可以出來了,但還是令人有點小意外,LINQ在某些環境下的確是有性能優勢的,這個理論上是成立的。但我想說的是,其實還有很多因素會影響到這個結論,我們真的不能以偏概全的說,LINQ一定有性能優勢或是Array.Sort一定有性能優勢。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美寡妇偷汉性猛交| 国产98色在线| 日韩欧美在线视频免费观看| 久久久999成人| 亚洲香蕉在线观看| 国产丝袜高跟一区| 久久综合久久八八| 亚洲香蕉av在线一区二区三区| 国产精自产拍久久久久久蜜| 国产a∨精品一区二区三区不卡| 国产精品自在线| 91成人天堂久久成人| 高清一区二区三区日本久| 久久久精品国产网站| 国产精品91久久| 最近更新的2019中文字幕| 7m精品福利视频导航| 26uuu日韩精品一区二区| 精品精品国产国产自在线| 亚洲国产精品电影在线观看| 欧美精品一区二区三区国产精品| 日韩av在线免费看| 欧美日本中文字幕| 亚洲成人久久一区| 精品视频—区二区三区免费| 91欧美视频网站| 欧美网站在线观看| 亚洲免费人成在线视频观看| 一区二区三区 在线观看视| 国产精品一区二区三区成人| 久久影院在线观看| 精品国产91久久久久久| 日本精品视频在线播放| 国产精品久久久久久久久久尿| 精品日韩视频在线观看| 91亚洲午夜在线| 国产日韩欧美日韩| 久久精品国产亚洲7777| 欧美高清在线播放| 欧美极品xxxx| 国产精品手机播放| 国内免费久久久久久久久久久| 国产一区二区美女视频| 国产欧美日韩中文字幕| 国产经典一区二区| 98精品国产自产在线观看| 国产aⅴ夜夜欢一区二区三区| 成人激情av在线| 欧美日韩一区二区精品| 国产成+人+综合+亚洲欧洲| 国产成人a亚洲精品| 国产精品xxx视频| 国语自产精品视频在线看| 欧美激情精品久久久久久| 精品国内产的精品视频在线观看| 国产精品人成电影在线观看| 日韩av电影免费观看高清| 麻豆国产精品va在线观看不卡| 欧美性开放视频| 欧美精品videosex性欧美| 中文字幕在线观看日韩| 亚洲国产一区二区三区在线观看| 夜夜嗨av色一区二区不卡| 国产精品尤物福利片在线观看| 欧美在线观看网址综合| 姬川优奈aav一区二区| 亚洲精品乱码久久久久久按摩观| 在线播放日韩欧美| 97在线观看免费高清| 在线观看欧美成人| 欧美高清第一页| 成人亚洲激情网| 日韩精品在线观看一区| 亚洲欧美激情一区| 亚洲成人精品久久久| 久久人人爽人人爽人人片亚洲| 国产成人精品久久二区二区| 国产高清视频一区三区| 精品视频在线播放| 欧美做爰性生交视频| 欧美高清无遮挡| 久久九九免费视频| 欧美亚洲在线视频| 日韩欧美在线视频免费观看| 日韩在线观看免费高清完整版| 国产精品一区久久久| 亚洲天堂av综合网| 亚洲国产精品久久| 欧美精品激情在线观看| 国产精品极品尤物在线观看| 日韩av在线电影网| 96精品久久久久中文字幕| 欧美激情精品久久久久久大尺度| 亚洲欧洲激情在线| 夜夜狂射影院欧美极品| 国产精品高潮视频| 国产一区二区三区丝袜| 亚洲一区二区国产| 国产精品狼人色视频一区| 91精品在线播放| 欧美成人午夜视频| 欧美最近摘花xxxx摘花| 亚洲国产小视频在线观看| 81精品国产乱码久久久久久| 欧美国产日韩免费| 国产精品久久久av| 国产精品入口日韩视频大尺度| 国产做受高潮69| 中文字幕亚洲欧美日韩在线不卡| 亚洲天堂成人在线| 国产精品丝袜高跟| 国内精品视频久久| 国产精品人成电影在线观看| 日韩欧美国产骚| 日韩不卡在线观看| 日韩激情av在线免费观看| 国产精品高潮在线| 亚洲精品成人免费| 国产精品99久久久久久www| 亚洲性视频网站| 国内精品久久影院| 热re91久久精品国99热蜜臀| 日本久久中文字幕| 欧美大肥婆大肥bbbbb| 久久久久日韩精品久久久男男| 日韩av免费在线观看| 在线看欧美日韩| 国产极品jizzhd欧美| 日本一区二区三区四区视频| 精品少妇一区二区30p| 欧美性猛交xxxx黑人| 日韩中文字幕亚洲| 成年人精品视频| 热99精品里视频精品| 亚洲精品一二区| 久久久爽爽爽美女图片| 日本中文字幕久久看| 久久五月天色综合| 98午夜经典影视| 久久亚洲精品视频| 亚洲一区中文字幕在线观看| 亚洲天堂网站在线观看视频| 18一19gay欧美视频网站| 最近2019中文免费高清视频观看www99| 91精品国产色综合久久不卡98口| 久久久久久久一区二区三区| 午夜精品一区二区三区视频免费看| 欧美在线视频观看| 国产精品久久久精品| 亚洲国产97在线精品一区| 欧美性猛交xxxx免费看漫画| 久久精品视频va| 亚洲视频在线观看视频| 亚洲另类激情图| 欧美大成色www永久网站婷| 另类美女黄大片| 亚洲伊人第一页| 在线成人免费网站| 久久的精品视频| 国产精品第七影院| 欧美日韩激情视频8区| 国产盗摄xxxx视频xxx69| 亚洲一区二区三区xxx视频| 亚洲免费人成在线视频观看|