2013-10-05 21 views
0

這是我遇到的一個問題。我有一臺服務器和一臺筆記本電腦。兩臺電腦都沒有運行。簡單的2行程序的CPU性能不一致。 C#.NET 4.0

這裏的程序:

static void Main(string[] args) 
    { 
     Stopwatch w = new Stopwatch(); 
     while(true) 
     { 
      w.Restart(); 
      for(int i = 0; i < int.MaxValue; i++) 
       ; 

      w.Stop(); 

      System.Console.WriteLine(w.ElapsedMilliseconds); 
     } 
    } 

在我的筆記本電腦,我得到大約650毫秒一致的性能。在服務器上,我瘋狂搖擺。從595到1500毫秒。兩臺電腦再次沒有運行任何東西。該程序非常簡單,甚至不使用RAM。可能只是註冊。

這是什麼原因造成的?我用passmark.com基準測試了服務器和筆記本電腦,看起來一切正常。

這裏是服務器的規格: 視窗2012的x64 CPU :至強e5-1620 @ 3.6

這裏是筆記本電腦的規格: Windows 7的64位CPU :i7-2620M @ 2.7

windows 7 i7-2620M screenshot

windows 2012 xeon e5-1260 screenshot

+1

這裏有太多變數可供我們在這裏給你一個可靠的答案..我會想。 –

+0

剛剛在C++中編寫了相同的程序,結果相同。服務器上的差異很大。它可能是一些CPU設置?有什麼方法可以診斷嗎?省電設置還是別的什麼? – Dennis

回答

2

測量與Stopwatch性能不是太精確,尤其是在更高級的系統上,因爲在高級硬件上,時序很大程度上取決於通常不受程序直接控制的事情,例如核心之間的遷移,進程和線程的優先級,高速緩存親緣性,各種CPU管線等等。

嘗試啓動秒錶之前將這些指令(from here):

Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(2); 
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High; 
Thread.CurrentThread.Priority = ThreadPriority.Highest; 

這應該使測量更加一致,特別是在多核心,多CPU盒。

+0

秒錶應使用QueryPerformanceCounter。所以它應該非常準確。 ProcessorAffinity似乎可以做到這一點。所以在這種情況下,它確實執行得更快,因爲它不切換內核。我不知道是否有辦法告訴它只保留在一個內核上,而不指定特定內核就不切換? – Dennis

+0

@ user2796794您可以使用[此處](http://stackoverflow.com/q/16525501/335858)中的'GetCurrentProcessorNumber',並將親和性設置爲'IntPtr(1 << procNumber)'。 – dasblinkenlight

0

Windows桌面爲前臺進程賦予更高的優先級,而Windows服務器對後臺進程賦予更高的優先級。這將會導致您所遇到的差異。

+0

我開始這項研究的原因是因爲IIS在響應時間上給我瘋狂的差異,因爲在內存唯一請求處理中同樣簡單。所以它也發生在後臺進程上。只用C++編寫了相同的程序,結果相同。服務器上的差異很大。它可能是一些CPU設置? – Dennis