2012-02-22 73 views
4

我測試在C#中某些情況下,考慮一些要領的表現, 當我在測試中,我面臨着一個奇怪的情況下C#性能怪異的情況下

for (int i = 0; i < 30; i++) 
{ 
    DateTime d = DateTime.Now; 
    print(); 
    result.Add ((DateTime.Now - d)); 
} 

foreach(TimeSpan t in result) 
    Console.WriteLine(t.ToString()); 

而打印功能很乾脆:

public static void print() 
{ 
    for (int i = 0; i < 10000; i++) 
    { 
     Console.WriteLine(string.Format("{0}", i));  
    } 
} 

我對結果感到震驚,而前三個循環耗時約5秒,而之後耗時約0.5秒。 下面是一些:

00:00:05.6212696 
00:00:05.6072002 
00:00:05.5837965 
00:00:01.9451673 
00:00:00.5526335 
00:00:00.5540554 
00:00:00.5676418 
00:00:00.5372442 
00:00:00.5772550 

我只是想知道爲什麼它的第三次迭代後得到了近10倍更好?

+0

每次運行它都會發生嗎? – GazTheDestroyer 2012-02-22 08:43:57

+0

這個問題可以重現嗎?當我測試時,我的結果在0.81和1.14秒之間。 – 2012-02-22 08:49:30

+0

是的@GazTheDestroyer先生和薩拉曼先生它似乎像Tigran說,它可以從個人電腦到個人電腦 – Hilmi 2012-02-22 10:25:12

回答

3

我只是運行相同的代碼在我的電腦,並得到了以下的輸出:

00:00:00.0469083 
00:00:00.0312722 
00:00:00.0312722 
00:00:00.0469083 
00:00:00.0312722 
00:00:00.0312722 
00:00:00.0312722 
00:00:00.0469083 

.... 

正如你看到的是沒有顯着差異。我建議,首先不要在 檢查這些類型的案件的性能,因爲它可以從PC到PC不同,並重復喬恩的建議,使用StopWatch更加準確的測量。

8

您的瓶頸將是Console.WriteLine。各種各樣的事情可能會影響到這一點,但特別是如果你最小化窗口或類似的東西,那可能會大大加快速度。

你確定你確實在測量任何有用的東西嗎?您的真實世界應用程序是否對控制檯進行了大量寫入?

請注意,通常使用StopwatchDateTime.Now更好地衡量性能,雖然在這裏沒有什麼區別。

+0

非常感謝我的朋友,總的來說你有一個觀點,但我認爲我的觀點是它變得更快,'Console.WriteLine'如何變得糟糕透了? – Hilmi 2012-02-22 08:27:25

+0

我在中途將控制檯窗口最小化的情況下進行了測試,但那幾乎不會導致user1225246獲得的加速。從大約1.6秒降到1.1。 – 2012-02-22 08:53:22

+0

@ user1225246:你掩蓋了控制檯窗口或類似的東西嗎?或者也許圖形子系統開始使用加速或類似的東西。基本上,除非你真的對測量控制檯輸出速度感興趣,否則這些數字是無用的。 – 2012-02-22 08:57:00