C语言 如果我多次运行同一个程序,它会精确地占用相同数量的时钟周期吗?

bfrts1fy  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(73)

对不起,没有具体的问题,我需要一种方法来计算我的算法所需的时钟周期的确切数量,用C语言编写,
->我尝试了clock()和Windows特定的函数,如QueryPerformanceCounter(),它们都没有在每次运行时给我精确的时钟周期。
每次运行时,我都得到完全不同的值。

**如果你建议任何方法来找到执行时间的时钟周期,这不会改变每次运行,这将是非常有帮助的。

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

lymnna71

lymnna711#

除非你在一个非常原始的处理器上运行你的程序,没有操作系统也没有设备驱动程序的干扰,否则就没有 * 你的算法所需要的确切的时钟周期数 * 这样的事情。在i5处理器上运行Windows 10绝对不合格。
你的程序执行所需的时间,甚至是时钟的数量都取决于无数的因素,这些因素在很大程度上使它不可预测:

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

所选程序片段的精确定时仍然是可能的,但不能降低时钟计数,并且需要高级技能来尝试和防止上述问题和其他问题的干扰。重复大量的短测试并保持最佳时间是一个好的开始,但总是会包含一定范围的不确定性,因此精度有限。
必须研究算法的更重要方面:时间和空间复杂性,最佳、平均和最差情况,以及最重要的正确性和范围限制。

相关问题