为啥clock()在集群机器上不起作用

Posted

技术标签:

【中文标题】为啥clock()在集群机器上不起作用【英文标题】:why clock() does not work on the the cluster machine为什么clock()在集群机器上不起作用 【发布时间】:2014-03-27 01:59:19 【问题描述】:

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

我的 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】:

不保证时钟精确到 ~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 的含义。除非您迫切需要每秒执行超过 20 次(假设您没有其他代码要运行),否则这可能不是问题。

关于最后一点,想想“用户在生气之前必须等待多长时间?”。这个问题的答案会有所不同,但在大多数情况下半秒可能就可以了。

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

【讨论】:

以上是关于为啥clock()在集群机器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 LESS css 在 localhost 上不起作用

为啥单击事件在 MacOS Safari 上不起作用?

为啥 getExternalFilesDirs() 在某些设备上不起作用?

为啥 android:colorBackground 在某些设备上不起作用?

为啥 saveStateInstance 在屏幕方向上不起作用?

为啥此文本输入在 iOS 上不起作用?