为什么clock()被认为是坏的

Why is clock() considered bad?

本文关键字:认为是 clock 为什么      更新时间:2023-10-16

曾经有人建议我使用依赖于平台的方法(适用于Windows的GetTickCount())来获取时间,而不是使用clock(),因为它很糟糕或不可靠。为什么?还有很多人建议使用的<chrono>头函数,但是,我在IDE(VS 2010)中找不到它。

如果重要的话,我的目标是游戏开发。

这并不是说时钟一定是坏的,而是它没有被定义为按照人们通常认为的方式运行。也就是说,它没有被指定为产生挂钟或"真实"时间。

clock()的定义是告诉您使用了多少CPU时间;使用更多的线程会占用更多的CPU时间,睡眠线程会占用更少的时间。

其次,并非所有平台都实现相同的行为;一些平台实现CCD_ 5,就好像它应该给墙上的时钟时间一样。因此,可移植代码不能将其用于任何目的。


然而,clock()可能被认为不好的一个原因是,即使对于非便携用途,它也有一个"类型不安全"的API,无法区分时间点和持续时间,也无法为您安全地管理时间单位。例如,使用它的API可以很容易地将本应表示微秒的值与本应表示毫秒的值混合在一起。

C++11 <chrono> API在这些方面做得更好。一个问题是<chrono>没有CPU时钟。如果你想要挂钟时间,那么std::chrono::steady_clock是最好的选择;它有一个类型安全的API,它被定义为"以稳定的速度实时推进"。


http://coliru.stacked-crooked.com/a/6df6c71a436092e3

睡眠4个线程,每个线程0.1秒
运行时间:0.101213秒
运行的cpu时间:0秒
纺纱4根,每根0.1秒
运行时间:0.100304秒
运行的cpu时间:0.4秒。


有趣的是,这里有一个<chrono>风格的时钟,用于使用std::clock():

#include <chrono>
#include <ratio>
#include <ctime>
struct cpu_clock {
    using rep = std::clock_t;
    using period = std::ratio<1, CLOCKS_PER_SEC>;
    using duration = std::chrono::duration<rep, period>;
    using time_point = std::chrono::time_point<cpu_clock, duration>;
    static const bool is_steady = false;
    static time_point now() noexcept {
        return time_point{duration{std::clock()}};
    }
};

根据:cppreference.com:std::clock()。

"std::时钟时间可能比挂钟前进得更快或更慢,取决于由操作系统。例如,如果CPU由其他用户共享进程,std::时钟时间可能比挂钟慢。关于另一方面,如果当前进程是多线程的并且不止一个执行核心可用,std::时钟时间可能比挂钟。"

此外:

"clock()返回的值可能在实现。例如,在具有32位std::clock_t的机器上,它在2147秒或36分钟后包裹。"

希望这能有所帮助