如果我多次运行同一个程序,它会花费相同数量的时钟周期吗?

Har*_*ari 0 c windows performance assembly intel

抱歉,我没有具体说明问题,我需要一种方法来计算我的算法所需的确切时钟周期数,用 C 编写,

->我尝试了clock()和Windows特定函数,如QueryPerformanceCounter(),它们都没有在每次运行时给我准确的时钟周期。

对于相同的输入,我每次运行都会得到完全不同的值。

如果您建议任何以时钟周期为单位查找执行时间的方法,并且每次运行都不会改变,那将非常有帮助。

硬件:我的是intel i5处理器,运行在windows 10操作系统下。

chq*_*lie 6

除非您在没有操作系统或设备驱动程序干扰的非常原始的处理器上运行程序,否则不存在算法所需的确切时钟周期数之类的东西。在 i5 处理器上运行 Windows 10 绝对不符合条件。

程序执行所需的时间甚至时钟数量取决于多种因素,这些因素使其在很大程度上不可预测:

  • 程序可能会发出操作系统调用来检索输入或产生输出:操作系统可能会在不同的运行中为这些调用执行不同的代码,从而导致不同的时间。
  • 程序可能具有未定义或实现定义的行为,导致非预测执行路径,即使这些似乎不会影响结果。
  • 现代处理器具有内存缓存,使内存访问依赖于先前的访问,包括在程序执行之前发生的访问。
  • 程序可能会被操作系统中断以处理设备请求或其他会干扰程序计时和时钟周期计数的任务,以及其他副作用(例如缓存刷新)。
  • 现代处理器使用分支预测和/或推测执行,这是一种指令缓存形式,会以多种方式影响周期计数,并且通常是不可再现的。
  • 硬件也可能会干扰:根据 CPU 温度,主板可能会调整时钟速度和/或 CPU 电压,从而影响运行时间,甚至可能影响时钟计数。
  • 最近的 CPU 甚至可能包括对读取时钟计数或使用一些其他精确定时测量的指令的非预测性调整,以防止依赖时钟测量来确定受保护的存储器内容的侧通道攻击。

所选程序片段的精确计时仍然是可能的,但不会降低时钟计数,并且需要高级技能来尝试防止上述问题和其他问题的干扰。多次重复短期测试并保持最佳时间是一个好的开始,但总会包含一定范围的不确定性,因此准确性有限。

必须研究算法的更重要方面:时间和空间复杂度、最佳、平均和最坏情况,最重要的是,正确性和范围限制。