使用C ++和Java定时代码块

时间:2013-12-12 14:24:05

标签: java c++ time timing

我试图将计时方法的准确性与C ++和Java进行比较。

使用C ++我通常使用CLOCKS_PER_SEC,我运行我想要时间一段时间的代码块,然后根据块的执行次数计算它花了多长时间。

使用Java我通常使用System.nanoTime()

哪一个更准确,我用于C ++或我用于Java的那个?在C ++中是否还有其他时间方法,所以我不必重复这段代码来获得正确的测量结果?基本上,C ++是否有System.nanoTime()方法?

我知道两者都使用导致相当长时间延迟的系统调用。这如何扭曲时间的实际价值?有什么方法可以阻止这种情况吗?

2 个答案:

答案 0 :(得分:0)

小心使用System.nanoTime(),因为它仍然受到您运行的计算机可以提供的分辨率的限制。

此外,Java的复杂性也很复杂,因为在为系统优化之前,通过函数的前几次会慢很多。

几乎所有现代系统都使用先发制人的多线程和多核等 - 所以所有时间都会因运行而异。 (例如,如果控制在方法中被切换离开你的线程)。

要获得您需要的可靠时间

  1. 在开始之前绕过几百次的东西来预热系统。
  2. 运行代码很多次并平均结果。
  3. 任何语言的可靠性问题都是相同的,因此对C和Java都适用,因此C可能不需要预热循环,但您仍需要采集大量样本并对其进行平均。

答案 1 :(得分:0)

每种方法都有错误。在你花大量时间研究这个问题之前,你必须问自己“我需要多长时间才能得到答案”?通常,解决方案是多次运行一个循环/一段代码,并跟踪测量的平均值/标准偏差。这是了解测量可重复性的好方法。之后,假设“开始时间”和“停止时间”调用之间的延迟是“可比较的”(无论您使用什么功能),并且您有一个框架来理解问题。

底线:clock()函数通常可以提供微秒精度。

有关如何在C中进行此操作的示例,请参阅https://stackoverflow.com/a/20497193/1967396(在该实例中,使用usec精度时钟)。可以使用ns计时 - 例如,查看使用clock_gettime(CLOCK_MONOTONIC_RAW, &tSpec);的{​​{3}}的答案

请注意,您必须分别从该结构中提取秒和纳秒。