性能诊断可提高性能

时间:2014-02-27 23:08:32

标签: c# performance linq visual-studio-2013 performance-testing

我在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,所以它就会消除它。