33

我刚刚编写了这个简短的 C++ 程序来估计每秒的实际时钟滴答数。

#include <iostream>
#include <time.h>

using namespace std;

int main () {

    for(int i = 0; i < 10 ; i++) {

        int first_clock = clock();
        int first_time = time(NULL);

        while(time(NULL) <= first_time) {}

        int second_time = time(NULL);
        int second_clock = clock();

        cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n";

        cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n";

    }

    return 0;

}

当我运行程序时,我得到如下所示的输出。

Actual clocks per second = 199139
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 638164
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 610735
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 614835
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 642327
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 562068
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 605767
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 619543
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 650243
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 639128
CLOCKS_PER_SEC = 1000000

为什么每秒的实际时钟滴答数与 CLOCKS_PER_SEC 不匹配?他们甚至不大致相等。这里发生了什么?

4

6 回答 6

36

clock返回在程序中花费的时间每秒总共有 1,000,000 个时钟滴答*。看来您的程序消耗了其中的 60%。

其他的 40% 被其他人使用。

*好的,每秒几乎有 1,000,000 个时钟滴答。实际数字已标准化,因此您的程序可以感知 1,000,000 个滴答声。

于 2012-05-04T20:54:36.897 回答
21

从手册页clock(3)

POSIX 要求 CLOCKS_PER_SEC 等于 1000000,与实际分辨率无关。

至少在这方面,您的实现似乎遵循 POSIX。

在这里运行你的程序,我明白了

Actual clocks per second = 980000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 990000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 1000000
CLOCKS_PER_SEC = 1000000

或空闲机器上的类似输出,并输出类似

Actual clocks per second = 50000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 530000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 580000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 730000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 730000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 560000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 600000
CLOCKS_PER_SEC = 1000000
Actual clocks per second = 620000
CLOCKS_PER_SEC = 1000000

在繁忙的机器上。由于clock()测量了程序中花费的(大约)时间,因此您似乎在一台繁忙的机器上进行了测试,而您的程序仅获得了大约 60% 的 CPU 时间。

于 2012-05-04T20:47:13.120 回答
6
  1. POSIX 中的 CLOCKS_PER_SECOND 是一个等于 1000000 的常数。
  2. CLOCKS_PER_SECOND 不应该显示进程中的时钟数。它是一个分辨率数字,您可以使用它来将时钟数转换为时间量。(有关 clock() 函数,请参见手册页)

例如,如果您计算:

(second_clock-first_clock)/CLOCKS_PER_SEC

您将获得第一次和第二次调用“clock()”函数之间的总时间。

于 2015-12-09T22:31:58.893 回答
1

C99标准

C99 N1256 标准草案唯一提到CLOCKS_PER_SEC的是:

CLOCKS_PER_SEC 扩展为类型为 clock_t 的表达式(如下所述),它是时钟函数返回的值的每秒数

正如其他人提到的,POSIX 将其设置为 100 万,这将其精度限制为 1 微秒。我认为这只是以兆赫兹为单位测量最大 CPU 频率的日子的历史值。

于 2016-04-16T13:10:46.247 回答
0

当你设置 int first_time = time(NULL); , time(NULL) 可能是“1 纳秒之外”,(因为它被截断了),从转 +1 开始。因此,: while(time(NULL) <= first_time) {} 可以比 1 秒更快地跳过,比您预期的要快。

这就是为什么在你的那“1 秒”中时钟更少的原因。

于 2020-09-18T00:31:44.510 回答
-2

嗯嗯。你不知道你开始计时的当前秒有多远,是吗?所以你可以得到从 1 到 CLOCKS_PER_SEC 的任何结果。在你的内部循环中试试这个:

int first_time = time(NULL);
// Wait for timer to roll over before starting clock!
while(time(NULL) <= first_time) {}

int first_clock = clock();
first_time = time(NULL);
while(time(NULL) <= first_time) {}

int second_time = time(NULL);
int second_clock = clock();

cout << "Actual clocks per second = " << (second_clock - first_clock)/(second_time - first_time) << "\n";

cout << "CLOCKS_PER_SEC = " << CLOCKS_PER_SEC << "\n";

完整的源代码见ideone。如您所料,它报告每秒的实际时钟为 1000000。(我不得不将迭代次数减少到 2 次,这样 ideone 才不会超时。)

于 2012-05-04T21:04:33.383 回答