驗證要多試幾種方法阿!!

  • 6229
  • 0

驗證要多試幾種方法阿!!

今天在做教材時寫sample code時發現了個有趣的東西

首先是看到MSDN這樣說 當集合元素為實值型別時,泛型集合型別通常要比對應的非泛型集合型別有較理想的效能 (也優於衍生自非泛型基底集合型別的型別),因為有了泛型就不需要將這些元素進行 Box 處理。

不過人家說說那我就信了嗎?當然不是阿~總是要自己求證一下所以寫了一段code

 

static void Main( string[] args )
{
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
 
    sw.Reset();
    sw.Start();
    List<string> list = new List<string>( 3 );
    list.Add( "1" );
    list.Add( "2" );
    list.Add( "3" );
    
    
    foreach( string s in list )
    {
        Console.WriteLine( s );
    }
    sw.Stop();
    Console.WriteLine( sw.ElapsedTicks + "" );
 
    sw.Reset();
    sw.Start();
    ArrayList array = new ArrayList( 3 );
    array.Add( "1" );
    array.Add( "2" );
    array.Add( 3 );
    
    foreach( object s in array )
    {
        Console.WriteLine( s + "" );
    }
    sw.Stop();
    Console.WriteLine( sw.ElapsedTicks + "" );
 
}

 

你猜怎麼著~

不管測幾次,下面的時間都比上面快超多!!

image

跟MSDN講的完全不一樣阿!!

然後想說是不是因為Stopwatch的關係所以改了一下程式

static void Main( string[] args )
{
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Reset();
    sw.Start();
 
    List<string> list = new List<string>( 3 );
    list.Add( "1" );
    list.Add( "2" );
    list.Add( "3" );
 
    foreach( string s in list )
    {
        Console.WriteLine( s );
    }
    sw.Stop();
    Console.WriteLine( sw.ElapsedTicks + "" );
 
    System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch();
    sw2.Reset();
    sw2.Start();
 
    ArrayList array = new ArrayList( 3 );
    array.Add( "1" );
    array.Add( "2" );
    array.Add( 3 );
 
    foreach( object s in array )
    {
        Console.WriteLine( s + "" );
    }
 
    sw2.Stop();
    Console.WriteLine( sw2.ElapsedTicks + "" );
}

結果還是一樣阿

image

怎麼樣ArrayList都比List<string>快很多很多阿!!

正當快絕望時,突然想到把上下顛倒一下,先來做ArrayList再來做List<string>

 

 

static void Main( string[] args )
{
    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
    sw.Reset();
    sw.Start();
 
    ArrayList array = new ArrayList( 3 );
    array.Add( "1" );
    array.Add( "2" );
    array.Add( 3 );
 
    foreach( object s in array )
    {
        Console.WriteLine( s + "" );
    }
 
    
    sw.Stop();
    Console.WriteLine( sw.ElapsedTicks + "" );
 
    System.Diagnostics.Stopwatch sw2 = new System.Diagnostics.Stopwatch();
    sw2.Reset();
    sw2.Start();
 
    List<string> list = new List<string>( 3 );
    list.Add( "1" );
    list.Add( "2" );
    list.Add( "3" );
 
    foreach( string s in list )
    {
        Console.WriteLine( s );
    }
 
    sw2.Stop();
    Console.WriteLine( sw2.ElapsedTicks + "" );
}

 

果真,反過來後,還是下面的跑的快…

image

 

我差點就誤會了ArrayList真的會比較快,那不過現在那個放下面那個快是到底要怎測勒

我試過了改用TimeSpan搭配DateTime.Now的時間差把Ticks算出來

狀況一樣,而且在取第二個值時更慘,常拿到0

image

 

我也試了在程式一開始時先用Sleep讓他睡一下再起來跑,結果還是一樣,沒變

我也想了是不是取樣範圍太小,改用回圈塞了100個值,還是一樣下面跑的快

 

甚至想說那多複製幾個區段混雜著用ArrayList跟List<string>

結果還是一樣,跟用ArrayLsit和List<string>沒太大關係

hum~~我放棄了