【问题标题】:Huge difference in dotTrace and Stopwatch function timingsdotTrace 和 Stopwatch 函数计时的巨大差异
【发布时间】:2015-03-24 22:55:48
【问题描述】:

在我的 C# 应用程序中分析几个函数的性能。我使用 .Net 秒表对超过 20,000 个调用的函数进行计时。每次调用的时间约为 2.8 毫秒。

但是,在逐行模式下使用 dotTrace 时,我发现对我的函数进行 20,000 次调用需要 249,584 毫秒,即每次调用约 12.5 毫秒。

现在,该函数已附加到一个调度计时器,因此秒表位于该函数内部,而不是注册调用本身。像这样:

private static Stopwatch myStop = new Stopwatch();
private MyFunction(object obj, EventArgs e)
{
    myStop.Start()

    //Code here

    myStop.Stop();
    Console.WriteLine("Time elapsed for View Update: {0}", myStop.Elapsed);
    myStop.Reset();
}

但是,我很难相信调用平均需要 10 毫秒。

还有什么其他因素会影响分析器或秒表的计时吗? dispatch timer 事件对时间的影响那么大吗?

我浏览了一些 JetBrains 论坛,但找不到任何与此相关的内容,但我确信我本可以更加努力地寻找并将继续这样做。我确实意识到秒表在某些方面是不可靠的,但没想到会这么严重。

需要注意的是,这是我第一次在 C# 或 .Net 中分析代码。

【问题讨论】:

    标签: profiling dottrace


    【解决方案1】:

    简答:逐行分析比任何其他分析类型的开销最大。

    对于逐行分析 dotTrace(和其他分析器)将插入对某些分析器函数的调用,例如 GetTime(),它计算上一次调用所花费的时间,将其求和并写入快照中的某个位置。

    所以你的功能不再那么快速和简单了。 如果不进行分析,您的代码可能如下所示:

    myStop.Start();
    var i = 5;
    i++;
    myStop.Stop();
    

    如果你在 profiler 下启动它,它会是这样的:

    dotTrace.GetTime();
    myStop.Start();
    dotTrace.GetTime();
    var i = 5;
    dotTrace.GetTime();
    i++;
    dotTrace.GetTime();
    myStop.Stop()
    

    因此,您获得的 12.5 毫秒包含了所有这些分析器 API 调用,并且极大地扭曲了绝对函数时间。主要需要逐行分析来比较相对语句时间。因此,如果您想准确测量绝对函数时间,您应该使用 Sampling profiling 类型。

    有关分析类型的更多信息,您可以参考dotTrace Profiling Typescomparison of profiling types 帮助页面。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      相关资源
      最近更新 更多