我试图将计时方法的准确性与C ++和Java进行比较。
使用C ++我通常使用CLOCKS_PER_SEC
,我运行我想要时间一段时间的代码块,然后根据块的执行次数计算它花了多长时间。
使用Java我通常使用System.nanoTime()
。
哪一个更准确,我用于C ++或我用于Java的那个?在C ++中是否还有其他时间方法,所以我不必重复这段代码来获得正确的测量结果?基本上,C ++是否有System.nanoTime()
方法?
我知道两者都使用导致相当长时间延迟的系统调用。这如何扭曲时间的实际价值?有什么方法可以阻止这种情况吗?
答案 0 :(得分:0)
小心使用System.nanoTime(),因为它仍然受到您运行的计算机可以提供的分辨率的限制。
此外,Java的复杂性也很复杂,因为在为系统优化之前,通过函数的前几次会慢很多。
几乎所有现代系统都使用先发制人的多线程和多核等 - 所以所有时间都会因运行而异。 (例如,如果控制在方法中被切换离开你的线程)。
要获得您需要的可靠时间
任何语言的可靠性问题都是相同的,因此对C和Java都适用,因此C可能不需要预热循环,但您仍需要采集大量样本并对其进行平均。
答案 1 :(得分:0)
每种方法都有错误。在你花大量时间研究这个问题之前,你必须问自己“我需要多长时间才能得到答案”?通常,解决方案是多次运行一个循环/一段代码,并跟踪测量的平均值/标准偏差。这是了解测量可重复性的好方法。之后,假设“开始时间”和“停止时间”调用之间的延迟是“可比较的”(无论您使用什么功能),并且您有一个框架来理解问题。
底线:clock()
函数通常可以提供微秒精度。
有关如何在C中进行此操作的示例,请参阅https://stackoverflow.com/a/20497193/1967396(在该实例中,使用usec精度时钟)。可以使用ns计时 - 例如,查看使用clock_gettime(CLOCK_MONOTONIC_RAW, &tSpec);
的{{3}}的答案
请注意,您必须分别从该结构中提取秒和纳秒。