我曾被建议使用平台相关方法(Windows GetTickCount()
)来获取时间而不是使用clock()
,因为它很糟糕或不可靠。为什么?还有许多建议的<chrono>
标头函数,但是,我在IDE(VS 2010)中找不到它。
我的目标是游戏开发,如果重要的话。
答案 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分钟后。 “
希望这会有所帮助。