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

时间:2015-02-08 15:55:12

标签: c++ c++11 game-engine clock

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

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

2 个答案:

答案 0 :(得分:20)

并不是说时钟被认为是坏的,因为它没有被定义为以人们通常认为的方式运作。也就是说,没有指定生成挂钟或“真实”的时间。

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

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


然而,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()}};
    }
};

答案 1 :(得分:7)

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

  

“std :: clock time可能比挂钟更快或更慢,   取决于由程序提供给程序的执行资源   操作系统。例如,如果CPU由其他人共享   进程,std :: clock时间可能比wall clock慢。在   另一方面,如果当前进程是多线程的并且不止一个   执行核心是可用的,std :: clock时间可能会超过   挂钟。 “

同时

  

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

希望这会有所帮助。