我在Visual Studio 2013中遇到了一个奇怪的异常。我在我的程序上运行性能分析(使用CPU采样),我发现在某些情况下,程序在分析时运行得更快。在需要使用较少量数据的情况下,性能分析似乎可以提高程序的性能。该程序使用并行扩展(C#和LINQ)并行化。
我的假设是这与并行性和少量数据有关。
是否有人发生过这种情况,或者任何人都可以解释可能是什么原因?
答案 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
,所以它就会消除它。