为什么clock()被认为是坏的
Why is clock() considered bad?
曾经有人建议我使用依赖于平台的方法(适用于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分钟后包裹。"
希望这能有所帮助
- 为什么rand()的使用被认为是不好的
- 为什么 std::shared_ptr 被认为是"heavy"和"expensive",但 std::array "same perfprmance as plain (c-style) arrays
- 一个C头文件可以被认为是一个接口吗
- 为什么const char*和const char[]作为函数参数被认为是等价的
- 为什么12.0==11.999999999999999999被认为是真的
- 这会被认为是糟糕的编程实践吗?
- 为什么这被认为是恒定的?
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 如果我具有调用其其他实例之一的超载函数,它是否被认为是递归功能
- std::unique_ptr可以被认为是一个monad吗?
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 使用自定义宏来简化 cin 和 cout 语句等内容被认为是更好还是更差
- 使用成员函数更改对象或返回并分配它是否被认为是更好的做法?
- 我很难修复我认为是双重免费的东西
- 使用 #define 被认为是"bad practice"吗?
- 是一个被认为是不同类型的班级内部的正向声明
- 这被认为是有效的C 11还是C 14?还是GCC/Clang弄错了
- 为什么这个嵌套的 lambda 不被认为是 constexpr?
- 限制C++中允许的模板参数是否被认为是不良样式?
- 为什么clock()被认为是坏的