【问题标题】:Performance diagnostics improves performance性能诊断提高性能
【发布时间】:2014-02-27 23:08:31
【问题描述】:

我在 Visual Studio 2013 中遇到了一个奇怪的异常。我正在对我的程序进行性能分析(使用 CPU 采样),我发现在某些情况下,程序在被分析时运行得更快。在需要处理少量数据的情况下,性能分析似乎可以提高程序的性能。该程序使用并行扩展(C# 和 LINQ)并行化。

我的假设是这与并行性和少量数据有关。

有没有人发生过这种情况,或者谁能解释一下可能是什么原因?

【问题讨论】:

  • 当它运行较慢时,您是否在附加调试器的情况下运行它?
  • 确实是这个原因。我不知道为什么我没有想到这一点。

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


【解决方案1】:

当您运行分析器时,调试器不会被附加。附加调试器可以防止在运行程序时发生大量优化,这主要是因为您会丢失在调试过程中可能想知道的信息。

这是一个简单的例子。

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,因此它会摆脱它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    相关资源
    最近更新 更多