为啥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()在集群机器上不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥 getExternalFilesDirs() 在某些设备上不起作用?
为啥 android:colorBackground 在某些设备上不起作用?