2011-05-11 111 views
2

我正在做一些基準測試。我有大量的1億64位整數,我隨機選擇了1000萬,並做了一些操作。索引是隨機選擇的,因爲我試圖儘可能保持CPU緩存不變,同時仍然獲得準確的基準。循環的第一次迭代大約需要0.3秒,其他時間只需要0.2秒。我唯一的猜測是cone []的部分仍然在緩存中,但我會認爲這個大小的數組不能存儲太多。任何其他想法?C# - 爲什麼這個循環的第一次迭代比其餘的慢?

也許是一個JIT的問題?

static void Main(string[] args) 
    { 

     Int64[] cone = new Int64[100000001]; 

     for (int m = 0; m < 20; ++m) 
     { 
      int[] num2 = new int[10000001]; 
      Random rand = new Random(); 

      for (int i = 0; i < 10000000; ++i) 
      { 
       num2[i] = rand.Next(100000000); 
      } 

      DateTime start = DateTime.Now; 

      for (int i = 0; i < 10000000; ++i) 
      { 
       cone[num2[i]] = i; 
       if (cone[i] > 0) ++cone[i]; 

      } 

      DateTime finish = DateTime.Now; 
      TimeSpan elapsed = finish - start; 

      Console.WriteLine("Took: {0}", elapsed); 
      Thread.Sleep(100); 
     } 
     Console.ReadLine(); 
    } 
+6

使用'秒錶'類。 – SLaks 2011-05-11 02:46:31

+0

@SLaks我正在閱讀Stopwatch課程。與我做的DateTime相比,它是否更準確? – cost 2011-05-11 02:51:59

+0

這很可能是因爲您在第一次迭代時分配了內存。在重複迭代中,它將繼續使用64位int數組,並重新分配第二個(更小的數組)。 – pickypg 2011-05-11 02:52:36

回答

5

可能是您第一次點擊循環時的代碼是Jitted。編譯時間是什麼讓它變慢?我運行了C++版本的代碼,並且每次迭代似乎都有相同的延遲。

+0

這是一個好主意,我也應該在C++中嘗試它。如果與C++沒有區別,那可能是JIT問題。這是一小段代碼,我認爲在開始時整個事情只會是Jitted。 – cost 2011-05-11 02:59:04

相關問題