c++ - 为什么 clock() 在集群机器上不起作用

标签 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。

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

最佳答案

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

The clock() function returns an approximation of processor time used by the program.

ISO 标准也是如此 C11 7.27.2.1 时钟函数/3:

The clock function returns the implementation’s best approximation of ...

并且在 7.27.1 时间的组成部分/4 中:

The range and precision of times representable in clock_t and time_t are implementation-defined.

从您的(诚然有限的)示例数据来看,您的集群机器的最小分辨率似乎在 10 毫秒左右。


无论如何,如果您需要更精细的分辨率,您有多种选择。

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

  • 其次,不要做一次。在一个紧密的循环中执行一千次,然后将所花费的时间除以 1000。这应该大致将您的分辨率提高一千倍。

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

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

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

关于c++ - 为什么 clock() 在集群机器上不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22676859/

相关文章:

c++ - 使用 QNetworkAccessManager 的插槽错误

c - 使用 gcc 在 C 中类型安全的可变参数

C++ 在分析时在 ntdll 中发现性能问题 - 如何摆脱它?

c++ - 模板特化结构大小

c++ - 如何判断传入的数组是一维、二维还是N维数组

c++ - 有没有办法在 clang 中检测 C++ 代码中的编译器 -fxxxx 标志?

c - GCC 因 fatal error 终止操作

C++ 警告 : division of double by zero

java - 如何分析生成的异常数量(按异常类或代码行分类)

java - @Profile 与 @ConditionalOnProperty