曾有人建议我使用平台相关的方法(Windows下的GetTickCount()
)来获取时间,而不是使用clock()
,因为它很糟糕或不可靠。 为什么?还有许多人建议使用<chrono>
头文件函数,但是我在我的IDE(VS 2010)中找不到它。
我的目标是游戏开发,如果这有影响。
曾有人建议我使用平台相关的方法(Windows下的GetTickCount()
)来获取时间,而不是使用clock()
,因为它很糟糕或不可靠。 为什么?还有许多人建议使用<chrono>
头文件函数,但是我在我的IDE(VS 2010)中找不到它。
我的目标是游戏开发,如果这有影响。
并不是说 clock()
是被视为不好的,而是它没有按人们通常想象的那样定义运行方式。换句话说,它没有指定生成墙钟时间或“真实”时间。
clock()
被定义为告诉您使用了多少 CPU 时间;使用更多线程会使用更多 CPU 时间,睡眠线程使用较少时间。
其次,并非所有平台都实现相同的行为;一些平台将 clock()
实现为应该给出墙钟时间。因此,可移植代码既不能用于一个目的也不能用于另一个目的。
clock()
可能被认为是不好的原因之一是它具有“类型不安全”的 API,该 API 不区分时间点和时间持续时间,并且不能安全地管理时间单位。例如,使用其 API,一个人可能会轻易地混合表示微秒的值与表示毫秒的值。<chrono>
API 在这些方面要好得多。唯一的问题是 <chrono>
没有 CPU 时间时钟。如果您想要墙上时钟时间,那么 std::chrono::steady_clock
是最佳选择;它具有类型安全的 API,并且被定义为“以实时稳定速率前进”。
http://coliru.stacked-crooked.com/a/6df6c71a436092e3
每个线程休眠0.1秒。
经过的墙壁时间:0.101213秒。
经过的CPU时间:0秒。
每个线程旋转0.1秒。
经过的墙壁时间:0.100304秒。
经过的CPU时间:0.4秒。
以下是使用std::clock()
的<chrono>
风格时钟,仅供娱乐:
#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()}};
}
};
void func(void *x)
{
while(true) {}
}
void main()
{
_beginthread(func, 0, 0);
while(true)
cout << clock() << endl;
}
CPU 时间应该是正常速度的两倍,但实际上并不是。为什么? - McLovinclock
函数出了问题。 - James Kanzechrono :: steady_clock
将允许您确定墙钟持续时间,而chrono :: system_clock
将(可能)为您提供“日历”时间。 - bames53
<chrono>
的原因。 - Alex