std::clock()和CLOCKS_PER_SEC

3
我想在我的程序中使用计时器功能。参照如何在C++中使用clock()的示例,我的代码如下:
int main()
{
    std::clock_t start = std::clock();

    while (true)
    {
        double time = (std::clock() - start) / (double)CLOCKS_PER_SEC;
        std::cout << time << std::endl;
    }

    return 0;
}

运行此代码后,它开始打印数字。但是,打印的数字需要大约15秒才能达到1。为什么打印的数字不需要1秒钟就能达到1?


2
你应该查看 <chrono>,它有一个 duration 的概念来完成这种类型的事情。 - Cory Kramer
可能是CLOCKS_PER_SEC not actually clocks per sec的重复问题。 - pyj
取决于操作系统。但显然,您正在生成输出的速度比“终端”可以滚动它的速度快得多。这很快就会遇到瓶颈,但是您必须坐下来等待它赶上来。 - Hans Passant
3个回答

2

std::clock返回的是CPU时间,而不是墙上时间(wall time)。这意味着它返回使用的CPU秒数,而不是经过的时间。如果您的程序只使用了CPU的20%,那么CPU秒数将以墙上秒数的20%的速度增加。


2
实际上,这是已发布内容的组合。基本上,当您的程序在紧密循环中运行时,CPU时间应该与挂钟时间同步增加。
但是,由于您的程序正在写入stdout,而终端具有有限的缓冲区空间,因此每当该缓冲区已满并且终端有足够的时间打印更多生成的输出时,您的程序将被阻塞。
当然,这在CPU方面比从“clock”值生成字符串要昂贵得多,因此大部分CPU时间将花费在终端和图形驱动程序上。似乎您的系统需要大约14倍的CPU功率才能输出时间戳,而不是生成要写入的字符串。

1

std::clock

返回自程序执行以来与实现相关的时代的开始之间使用的处理器时间的近似值。要将结果值转换为秒,请将其除以CLOCKS_PER_SEC。

因此,直到程序使用了实际的cpu时间,它才会返回一秒钟。

如果你想处理实际时间,我建议你使用<chrono>提供的时钟,如std::steady_clockstd::high_resolution_clock


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接