为什么时间测量有时会返回重复值(15.625ms 的倍数)?

Why does time measurement sometimes return repetitive values (multiples of 15.625ms)?

本文关键字:625ms 测量 时间 返回 为什么      更新时间:2023-10-16

我做了很多搜索并发现了类似的问题,但我仍然无法理解为什么有时我的代码时间正确,而有时决定变得无用并返回重复值。

您可以运行一个简单的C++代码来测试这一点:

#include <iostream>
#include <chrono>
#include <windows.h>
//#include <unistd.h>  //For Unix
void stall(int milisseconds){
auto start = std::chrono::high_resolution_clock::now();
Sleep(milisseconds);
//usleep(milisseconds*1000);   //For Unix
auto finish = std::chrono::high_resolution_clock::now();
std::cout<<std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count()/1000000.0<<" msn";
}
int main(){
std::cout<<"Beginn";
for (int i = 1; i < 100; i++){
stall(i);
}
}

运行此函数,预期的输出将如下所示:

1 ms
2 ms
3 ms
4 ms
...
98 ms
99 ms
100 ms

有时它有效,但其他时候(例如,随机(,输出如下所示:

15.625 ms
15.62 ms
15.632 ms
7.997 ms
16.713 ms
15.637 ms
31.25 ms
31.263 ms
31.245 ms
31.25 ms
21.985 ms
...
93.718 ms
93.77 ms
93.744 ms
102.263 ms
109.369 ms
96.192 ms
109.367 ms
109.368 ms

我怎样才能消除这种可怕的不一致?减少后台进程的数量似乎没有任何效果。

我猜这是由于操作系统的调度量程:如果您的线程产生或完成其执行时间量程,则其他一些线程将为该量程运行,然后当您的线程再次运行时,一个完整的量子(和位(已经过去了。因此,您会看到噪声+0个量子或1个量子的进步。

einpoklum 建议这可能是因为我的操作系统的调度量子,这听起来是正确的。我快要发疯了,认为这是超出我控制范围的事情(或者太复杂而无法解决(,但我最终以某种方式发现了一种操纵它的方法。我注意到,如果关闭互联网浏览器,返回的时间是一个非常一致的 15.625 倍序列。但是,如果我运行浏览器,看起来我打开的选项卡越多,时间就越不一致(但仍倾向于 15.625 的倍数(。如果一个选项卡加载了一些东西,数字开始看起来像 1 到 1 的常规序列!

所以,我得出的结论是,无论我必须进行测试,我都会在旁边放一个Youtube或Twitch标签。这很奇怪(如果有更好的方法,我想知道(,但现在,我将不得不将有用的与愉快的结合起来,哈哈