在准确确定算法在程序中运行的速度时,我总是将QueryPerformanceCounter()与QueryPerformanceFrequency()结合使用,但是当我使用核心i5 / 7架构时会发生什么?
涡轮增压是否有可能突然在我的算法中间突然出现,突然我的性能计时器不再准确,因为我的时钟频率不再是常数,或者这真的不是问题?如果这是一个问题,那么准确计算算法的更好方法是什么?
答案 0 :(得分:3)
简单地说,是的,任何事情都可能发生。现代CPU只是简单地估计现实世界的表现很难做到。这不仅限于最新的Intel x86-64 cpu,它同样适用于8位PIC单片机,以及它们之间的所有内容。
唯一合理的做法就是测试更多。您需要执行许多重复测试,以准确了解实际硬件上实际工作负载的实际运行时性能。
另一方面,如果一个算法在同一个硬件上胜过另一个算法(“在我的机器上”),那么它通常会在其他设置上给出类似的比较结果,尽管它可能会因常数因素而变化。
答案 1 :(得分:2)
这是一篇关于 QueryPerformanceCounter 主题的有趣文章:
http://www.virtualdub.org/blog/pivot/entry.php?id=106
显然,VirtualDub老兄停止使用它,现在支持 timeGetTime 。好读。
我建议使用 Boost.Date_Time ,特别是 boost :: posix_time 。
答案 2 :(得分:1)
这里实际上有两个不同的问题:
当CPU时钟频率发生变化时,任何给定时序方法的可靠性(通过例如Turbo Boost增加或由于例如省电或热管理引入而减少) - 这在其他一些答案中得到解决
基准测量的可靠性(给定可靠的时钟) - 如果您正在进行优化并寻找小的改进,那么这就更成问题了。大约10%,然后很容易被Turbo Boost的时钟变化的影响误导。可能的解决方案是:
2.1。禁用Turbo Boost和其他时钟频率缩放
2.2。运行基准测试足够长的时间来平均时钟速度变化
答案 3 :(得分:1)
QPC的定时源传统上从来没有从时钟频率中获得。主板制造商一直在偷工减料,试图削减一两分钱。它们通常从某个地方的芯片组内部拾取频率。我听说有人的AMD机器的QPF值为2 GHz,危险地接近于倍增后CPU时钟的值。如果你得到这样的大价值,那就太紧张了。
QPC的绝对值应该从不成为您的关注点。它将在很大程度上取决于核心的质量。只能使用QPC测量来寻找代码的渐进式改进。