是否有客观衡量绩效的工具/方法?

时间:2016-08-10 15:33:32

标签: c++ performance

我正在使用Visual Studio在C ++中编写高性能应用程序(光线跟踪器),我花了两天时间试图根除我在重构代码后见证的性能下降。花了这么长时间的原因是因为性能下降小于我在运行中看到的执行时间的正常变化。

不确定这是否正常,但有时程序可能会以大约33fps的速度运行,然后如果你关闭并重新运行,它可能以37fps运行。这意味着为了测试任何新的变化,我必须手动运行并重新运行,直到我目睹峰值性能(并且这可能需要最多10次运行)。只需运行一些大量的帧,并测量时间并不能解决这种可变性。例如,如果程序平均运行40秒,那么它将变化超过1-2秒,这使得该测试几乎无法用于检测我正在处理的每帧1毫秒的性能损失。

Visual Studio的分析工具也没有帮助找到这个小问题,因为它们也受到变化的影响,无论如何,它不一定会告诉我确切的违规行,所以我必须测试解决方案,而剖析器在确认提出的解决方案的功效方面不是很有效。

我意识到这一切可能听起来像是过早优化,但我不认为这是因为我在完成完整功能后仅优化 ;我只是试图定期监控性能变化,以便上述问题不会出现,只会增加新功能的明显成本。

无论如何,我的问题是,是否有办法客观地确定"真实"申请的速度,折扣变化的影响。或者,如果不这样做,开发人员如何处理这些问题呢?我怀疑我目前的过程是否理想。

1 个答案:

答案 0 :(得分:1)

有很多适用于 c++ 和 openGL 的分析器。对于那些只需要链接的人,这里有。

OpenGL debugger-profiler

C++ profilers 但我推荐 Google orbit 因为它有深色主题。

我的眼睛停在

<块引用>

客观衡量绩效

正如您提到的,速度因运行而异,因为它的系统太复杂了。如果范围很小并且它只测试一些关键算法,它会有所帮助。值得自动化并收集一些参考数据。正如每位科学家所说,一项测试不是一项测试,您应该依靠受控环境下的常规测试。

这里有一些可用于衡量性能的技巧。

  • 在其他人的评论中,基于多次运行的平均值可能对您有所帮助。它可以柔化外界的噪音。
  • 进程优先级或处理器亲和性可以帮助您控制环境。通过为其他进程设置低优先级,您的程序可以获得更多资源。
  • 衡量测试的整个执行情况并将其与处理器时间进行比较。由于多个进程同时运行,因此处理器时间可能与执行时间不同。
  • 如果您进行软件更新,请更新您的参考值。也许一项更新带来了性能提升,而另一项更新带来了安全补丁。
  • 为您的程序提供一个性能范围,而不是一个特定的数字。也许温度会影响您的测量,从而降低时钟速度。
  • 如果测试运行速度太快而无法衡量,请在测试用例中多次执行最关键的部分。太快取决于您可以测量的准确程度。以毫秒为基础,很难确定在 2 毫秒而不是 1 毫秒内执行的测试是否失败。但是,如果执行 1000 次 - 1033 毫秒(与 1000 毫秒相比)可让您获得更好的洞察力。
  • 仅测试关键部分。设置环境并在一切准备就绪后启动秒表。系统启动可能是另一个测试。