1
我在Visual Studio 2013中遇到了一個奇怪的異常。我正在對我的程序運行性能分析(使用CPU採樣),並且發現在某些情況下,程序在分析時運行速度更快。性能分析似乎在需要使用較少量數據的情況下提高了程序的性能。該程序使用並行擴展(C#和LINQ)進行並行化。性能診斷提高了性能
我的假設是,這與平行度和少量數據有關。
有沒有人有這種情況發生,或任何人都可以解釋可能是什麼原因?
我在Visual Studio 2013中遇到了一個奇怪的異常。我正在對我的程序運行性能分析(使用CPU採樣),並且發現在某些情況下,程序在分析時運行速度更快。性能分析似乎在需要使用較少量數據的情況下提高了程序的性能。該程序使用並行擴展(C#和LINQ)進行並行化。性能診斷提高了性能
我的假設是,這與平行度和少量數據有關。
有沒有人有這種情況發生,或任何人都可以解釋可能是什麼原因?
當您運行分析器時,調試器將不會被附加。連接調試器可以防止在運行程序時發生大量優化,這主要是因爲在調試過程中,您可能會想要了解信息。
這是一個簡單的例子。
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
,因此它將被清除。
運行速度較慢時,是否使用附加的調試程序運行? –
事實上,這是原因。我不知道爲什麼我沒有想到這一點。 –