2010-11-27 67 views
6

在确定准确的算法在我的程序是如何运行的快,我一直在与QueryPerformanceFrequency的()结合使用QueryPerformanceCounter的(),当我使用的是酷睿i5但是会发生什么/ 7架构?确定程序运行时间

是否有可能涡轮增压会突然踢中途通过我的算法,突然我的表演定时器不再准确,因为我的时钟频率不再是一个常数或这真的不是一个问题?如果这是一个问题,那么准确计算算法的更好方法是什么?

+0

是的涡轮增压可以踢英寸很好的观察:) – basarat 2010-11-27 07:39:20

回答

3

简单地说,是的,任何事情都有可能发生。现代CPU只是简单地估计真实世界的表现,该死的难以做到。这并不仅限于最新的Intel x86-64 cpus,它同样适用于8位PIC微控制器以及其间的所有内容。

的唯一合理的事情怎么办呢是刚刚测试更多。您需要执行多次重复测试才能获得关于实际工作负载的实际硬件上实际运行时性能的准确信息。另一方面,如果一种算法在同一硬件上(“在我的机器上”)优于另一种算法,那么它通常会在其他设置上给出类似的比较结果,尽管它可能因恒定因子而变化。

+0

所以我真的应该看看一个算法进程的平均CPU周期数,而不是按频率划分,并得到一个纳秒的时间? – Faken 2010-11-27 07:45:09

2

这里有QueryPerformanceCounter的主题的有趣的文章:

http://www.virtualdub.org/blog/pivot/entry.php?id=106

显然,VirtualDub的花花公子停止使用它,而现在有利于timeGetTime。一个很好的阅读。

我建议使用的Boost.Date_Time,特别是的boost ::了posix_time东西。

1

实际上有两个独立的位置的问题:任何给定的定时方法的

  1. 可靠性时CPU的时钟频率的变化(通过例如智能加速增加或由于例如功率节省或热管理踢的减小) - 这在一些其他答案中得到了解决

  2. 基准测量的可靠性(给出可靠的时钟) - 这是更成问题的 - 如果您正在进行优化并寻找小的改进,例如大约10%,那么很容易被Turbo Boost的时钟变化的影响误导。可能的解决方案是:

    2.1。禁用智能加速和其它时钟频率缩放

    2.2。足够长的时间运行的基准,平均出时钟速度变化

1

为QPC利用定时信号源是传统上从未从时钟频率得到的。尽管如此,主板制造商一直在偷工减料,试图削减1美分或2美分。他们通常从芯片组的某个地方拾取一个频率。我听说有人的QPF值为2 GHz的AMD机器,这个危险性接近于乘法后CPU时钟的值。只有当你获得这样的大价值时才会紧张。

QPC的绝对值应该是从来没有是您关心的问题。这将主要取决于核心的质量。只有使用QPC测量才能查看代码的渐进式改进。