2016-11-08 19 views
1

私は、プロジェクトが何百万ものオブジェクトをループするので、本質的に高速であるかどうかを調べるためにループで簡単なテストを行っています。このテストでは、Listに1ミリオンのオブジェクトがあり、それぞれにMyClass.Ageプロパティが設定されます。私は各オブジェクトをループし、Ageプロパティを引き出します。私はForeachループとForループでこれを行います。誰かが奇妙な結果を説明したり、私は愚かなエラーを作ったことを私に示して...おかげForeach対Forループ異常な結果

static int trial = 1; 
    static void Main(string[] args) 
    { 
     while (Console.ReadKey().Key == ConsoleKey.Enter) 
     { 
      Run(); 
      trial++; 
     } 
    } 

    private static void Run() 
    { 
     Console.WriteLine(); 
     Console.WriteLine("Trial " + trial.ToString()); 

     List<MyClass> classes = new List<MyClass>(); 
     for (int x = 1; x <= 1000000; x++) 
     { 
      classes.Add(new MyClass(x)); 
     } 

     DateTime startTime = new DateTime(); 
     DateTime endTime = new DateTime(); 

     DateTime startTime2 = new DateTime(); 
     DateTime endTime2 = new DateTime(); 

     startTime = DateTime.Now; 
     foreach (MyClass c in classes) 
     { 
      int age = c.Age; 
     } 
     endTime = DateTime.Now; 
     TimeSpan span = endTime - startTime; 
     Console.WriteLine("ForEach Time: " + span.TotalMilliseconds.ToString("#,##0.00000").PadLeft(10) + "ms"); 


     startTime2 = DateTime.Now; 
     for (int x = 0; x < classes.Count; x++) 
     { 
      int age = classes[x].Age; 
     } 
     endTime2 = DateTime.Now; 
     TimeSpan span2 = endTime2 - startTime2; 
     Console.WriteLine("ForLoop Time: " + span2.TotalMilliseconds.ToString("#,##0.00000").PadLeft(10) + "ms"); 
    } 

    class MyClass 
    { 
     public int Age; 

     public MyClass(int a) 
     { 
      Age = a; 
     } 
    } 

結果してくださいすることができます

Trial 1 
ForEach Time: 15.60000ms 
ForLoop Time:  0.00000ms 

Trial 2 
ForEach Time:  0.00000ms 
ForLoop Time: 15.60000ms 

Trial 3 
ForEach Time: 15.60000ms 
ForLoop Time:  0.00000ms 

Trial 4 
ForEach Time: 15.60000ms 
ForLoop Time:  0.00000ms 

Trial 5 
ForEach Time: 15.60010ms 
ForLoop Time:  0.00000ms 

Trial 6 
ForEach Time:  0.00000ms 
ForLoop Time:  0.00000ms 

Trial 7 
ForEach Time: 15.60000ms 
ForLoop Time:  0.00000ms 

Trial 8 
ForEach Time: 15.60010ms 
ForLoop Time:  0.00000ms 

Trial 9 
ForEach Time:  0.00000ms 
ForLoop Time: 15.60010ms 

Trial 10 
ForEach Time:  0.00000ms 
ForLoop Time:  0.00000ms 

答えて

2

あなたはSystem.Diagnostic.StopWatchクラスを使用しての代わりに、適切なためDateTime.Nowを使用する必要があります時間経過の比較

+0

それを修正しました。 Datetimeの理由を洞察してもらえますか? – user2777664

+1

@ user2777664、そうです。この記事をチェックするhttp://stackoverflow.com/questions/2923283/stopwatch-vs-using-system-datetime-now-for-timing-events(OR)MSDNのドキュメント。要するに、 'stopwatch'は' DateTime.Now'よりも精度が高いです – Rahul

+0

ありがとう!それは有り難いです。 – user2777664

関連する問題