我在Visual 2013中遇到了一个奇怪的异常。我正在我的程序上运行性能分析(使用CPU采样),我发现,在某些情况下,程序在被分析时运行得更快。在需要处理较小数据量的情况下,性能分析似乎可以提高程序的性能。该程序使用并行扩展(C#和LINQ)并行化。
我的假设是,这与并行性和少量数据有关。
有没有人发生过这种情况,或者谁能解释原因?
发布于 2014-02-27 23:14:29
当您运行分析器时,调试器将不会被附加。安装调试器可以防止在运行程序时发生许多优化,这主要是因为您可能会在调试过程中丢失您想要知道的信息。
下面是一个简单的例子。
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,因此就会将其清除。
https://stackoverflow.com/questions/22082668
复制相似问题