以下是我收集到的几个事实:
- GCC通过Clock_GetTime(Clock_monotonic,...)syscall实现STRATE_CLOCK::NOW();
- Llvm的libc++通过lock_gettime(lock_monotonic,...)syscall for Unix实现了STRATE_CLOCK::NOW().在Windows下通过QueryPerformanceCounter(...)实现;
- Ruust的时间间隔使用Unix下的CLOCK_GETTIME(CLOCK_MONTOTONIC,...)和Windows下的QueryPerformanceCounter(...);
我没有判断其他平台,但由于Rust在幕后使用了llvm,所以它很可能使用相同的系统调用.因此,Rust的Interval和C++STATED_CLOCK实现使用完全相同的音节,至少对于GCC和llvm是这样.
此外,Unix的Clock_gettime()syscall不能保证有一个稳定的速率(或者至少我找不到这样的保证),所以这样的C++保证令人费解.此外,如果我们查看实际的C++标准,它所表达的内容略有不同:
23.17.7.2班级稳定时钟
- 类STATED_CLOCK的对象表示TIME_POINT的值作为物理时钟从不减小的时钟
时间推进,并且其时间点的值相对于实时以稳定的速率前进.也就是说,时钟可能不会调整.
对我来说,"稳定的汇率"更多的是关于"时钟不能调整",而不是保证滴答之间的时间是恒定的.对我来说,"稳定利率"这个词听起来很模糊.但是,我想这是一个解释的问题.
无论哪种方式,Rust和C++都以相同的方式实现这些时钟,而且这种情况不太可能改变.我认为真相介于两者之间:C++的保证不可能是真的(除非时间恒定到一定的精度),而Rust的警告可能并不像听起来那么糟糕.
EDIT:一些x86 CPU,实际上是所有从奔腾4开始的Intel CPU,都有这个称为"常量TSC"的功能.根据the wikipedia,在Unix系统上可以通过CLOCK_GETTIME(CLOCK_MONTOTONIC_RAW,...)访问它,并且它内置在Windows上的QueryPerformanceCounter中.这个"时钟"以独立于CPU速度的方式滴答作响,但它离"恒定速率"有多近还不清楚(至少对我来说是这样).可能已经很接近了.当然,您需要在Unix上直接执行syscall,而且它仅限于x86 Arch.在系统挂起时,也似乎没有滴答作响.我不知道其他 arch 是否也有类似的东西.