2014-02-27 167 views
1

我在Visual Studio 2013中遇到了一個奇怪的異常。我正在對我的程序運行性能分析(使用CPU採樣),並且發現在某些情況下,程序在分析時運行速度更快。性能分析似乎在需要使用較少量數據的情況下提高了程序的性能。該程序使用並行擴展(C#和LINQ)進行並行化。性能診斷提高了性能

我的假設是,這與平行度和少量數據有關。

有沒有人有這種情況發生,或任何人都可以解釋可能是什麼原因?

+1

運行速度較慢時,是否使用附加的調試程序運行? –

+0

事實上,這是原因。我不知道爲什麼我沒有想到這一點。 –

回答

3

當您運行分析器時,調試器將不會被附加。連接調試器可以防止在運行程序時發生大量優化,這主要是因爲在調試過程中,您可能會想要了解信息。

這是一個簡單的例子。

void SomeFunction() 
{ 
    var foo = new SomeTypeThatTakesUp1GBOfRam(); 

    DoSomthingWithFoo(foo); 

    for(int i = 0; i < 10000; i++) 
    { 
     Thread.Sleep(1000); 
    } 
} 

當你有附加foo調試器不能被垃圾收集,直到它超出範圍在函數的底部(這將需要相當長的一段時間)。如果您沒有附加調試器foo,只要DoSomthingWithFoo(foo)返回,就有資格進行垃圾回收。

它必須等待收集它的原因是,如果您在for循環的第2000個循環中暫停調試器,並且想要查看foo的值?如果垃圾收集器尚未收集變量,則只能這樣做。如果調試器未連接,則運行時知道在任何稍後的時間點沒有什麼「需要看到」foo,因此它將被清除。