驗證要多試幾種方法阿!!
今天在做教材時寫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 + "" );
}
你猜怎麼著~
不管測幾次,下面的時間都比上面快超多!!
跟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 + "" );
}
結果還是一樣阿
怎麼樣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 + "" );
}
果真,反過來後,還是下面的跑的快…
我差點就誤會了ArrayList真的會比較快,那不過現在那個放下面那個快是到底要怎測勒
我試過了改用TimeSpan搭配DateTime.Now的時間差把Ticks算出來
狀況一樣,而且在取第二個值時更慘,常拿到0
我也試了在程式一開始時先用Sleep讓他睡一下再起來跑,結果還是一樣,沒變
我也想了是不是取樣範圍太小,改用回圈塞了100個值,還是一樣下面跑的快
甚至想說那多複製幾個區段混雜著用ArrayList跟List<string>
結果還是一樣,跟用ArrayLsit和List<string>沒太大關係
hum~~我放棄了