为什么clock()不能在集群机器上运行

时间:2014-03-27 01:59:19

标签: c++ gcc profiling cpu

我想获得部分代码的运行时间。

我的C ++代码如下:

...
time_t t1 = clock();
/*
Here is my core code.
*/
time_t t2 = clock();
cout <<"Running time: "<<  (1000.0 * (t2 - t1)) / CLOCKS_PER_SEC << "ms" << endl;
...

此代码适用于我的笔记本电脑。(Opensuse,g ++和clang ++,Core i5)。

但它在部门中的群集上效果不佳。 (Ubuntu,g ++,amd Opteron和intel Xeon)

我总是得到一些整数运行时间: 喜欢:0ms或10ms或20ms。

是什么原因造成的?为什么?谢谢!

1 个答案:

答案 0 :(得分:1)

时钟不能保证精确到~10 -44 秒(普朗克时间),它们通常具有最小分辨率。 Linux手册页暗示了这一点:

  

clock()函数返回程序使用的近似处理器时间。

ISO标准C11 7.27.2.1 The clock function /3

也是如此
  

时钟函数返回实现的最佳近似值 ...

7.27.1 Components of time /4

  

clock_t和time_t中可表示的时间范围和精度是实现定义的。

从您的(公认有限的)示例数据来看,您的群集计算机的最低分辨率看起来大约为10毫秒。


无论如何,如果你需要更精细的分辨率,你有几种可能性。

  • 首先,找到一种(可能是特定于实施的)更准确地计时的方法。

  • 其次,不要做一次。在一个紧密的循环中做一千次,然后将所用的时间除以1000.这应该粗略地将你的分辨率提高一千倍。

  • 第三,考虑一下你的代码在外面只需50ms的含义。除非您迫切需要每秒执行超过二十次(假设您没有其他代码可以运行),否则可能不是问题。

关于最后一点,请考虑诸如&#34;用户在烦恼之前必须等待的最长时间?&#34;。对此的答案会有所不同,但在大多数情况下,半秒钟可能会很好。

由于50ms代码在此期间可能会运行十次,因此您可能希望忽略它。您最好专注于影响明显较大的代码。