5

使用 dotTrace 时,我必须选择分析模式和时间测量方法。 分析模式是:

  • 追踪
  • 逐行
  • 采样

时间测量方法有:

  • 挂时(性能计数器)
  • 线程时间
  • 挂墙时间(CPU 指令)

跟踪和逐行不能使用线程时间测量。但这仍然让我有七种不同的组合可以尝试。我现在已经阅读了十多次关于这些的 dotTrace 帮助页面,但我仍然没有比我开始选择哪个更了解。

我正在开发一个 WPF 应用程序,该应用程序读取 Word 文档,提取所有段落和样式,然后遍历提取的内容以挑选文档部分。我正在尝试优化这个过程。(目前它需要一个多小时才能完成,所以我试图在给定的时间长度内对其进行分析,而不是直到它完成。)

哪种分析和时间测量类型会给我最好的结果?或者如果答案是“取决于”,那么它取决于什么?给定的分析模式或时间测量方法的优缺点是什么?

4

1 回答 1

6

分析类型:

  • 采样:最快但最不准确的分析类型,最小的分析器开销。本质上相当于每秒多次暂停程序并查看堆栈跟踪;因此每个方法的调用次数是近似的。对于在方法级别识别性能瓶颈仍然有用。

    以采样模式捕获的快照在磁盘上占用的空间要少得多(我会说少了 5-6 个空间。)用于初始评估或分析长时间运行的应用程序(这听起来像你的情况。)

  • 跟踪:记录每种方法所用的持续时间。分析下的应用程序运行速度较慢,但​​作为回报,dotTrace 显示每个函数的准确调用次数,并且函数计时信息更准确。这有利于深入研究方法级别的问题细节。

  • 逐行:逐行分析程序。最大的资源消耗,但最细粒度的分析结果。减慢程序速度。这里首选的策略是最初使用另一种类型进行分析,然后手动选择函数进行逐行分析。


至于仪表类型,我认为伟大的 Hadi Hariri在 dotTrace Performance 入门中对它们进行了很好的描述。

挂钟(CPU 指令):这是测量挂钟(即我们在挂钟上观察到的时间)最简单、最快的方法。但是,在某些较旧的多核处理器上,由于内核计时器不同步,这可能会产生不正确的结果。如果是这种情况,建议使用性能计数器。

挂时(性能计数器):性能计数器是 Windows API 的一部分,它允许以独立于硬件的方式进行时间采样。但是,作为 API 调用,每项措施都需要大量时间,因此会对已分析的应用程序产生影响。

线程时间:在多线程应用程序中,并发线程贡献彼此的墙时间。为了避免这种干扰,我们可以使用线程时间计,它会调用系统 API 来获取操作系统调度程序给线程的时间量。缺点是获取线程时间样本比使用 CPU 计数器慢得多,并且精度还受到线程调度程序使用的量子大小(通常为 10 毫秒)的限制。仅当 Profiling Type 设置为 Sampling 时才支持此模式

然而它们并没有太大的不同。


我不是分析自己的向导,但在你的情况下,我会从采样开始以获得执行时间非常长的函数列表,然后我会将它们标记为逐行分析。

于 2012-03-10T22:15:08.067 回答