0

在我的 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 毫秒。

是否还有其他可能影响分析器或秒表计时的因素?调度计时器事件对时间的影响那么大吗?

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

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

4

1 回答 1

0

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

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

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

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

如果你在分析器下启动它,它将是这样的:

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

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

有关分析类型的更多信息,您可以参考dotTrace 分析类型和分析类型比较帮助页面。

于 2015-04-20T10:39:30.910 回答