为什么时间测量有时会返回重复值(15.625ms 的倍数)?
Why does time measurement sometimes return repetitive values (multiples of 15.625ms)?
我做了很多搜索并发现了类似的问题,但我仍然无法理解为什么有时我的代码时间正确,而有时决定变得无用并返回重复值。
您可以运行一个简单的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标签。这很奇怪(如果有更好的方法,我想知道(,但现在,我将不得不将有用的与愉快的结合起来,哈哈
相关文章:
- 在C++中测量postscript字体宽度
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 用时钟测量程序的运行时间
- 用于测量微秒的QueryPerformanceCounter的奇怪行为
- 为什么根据测量位置测量经过的时间时会有很大的不同?
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 为什么在尝试测量函数返回所需的时间时,我的运行时编号是错误的?
- 分别测量每个线程上花费的 CPU 时间(C++)
- 如何测量管道延迟?
- 测量时间以在 c++ 中生成更好的随机数
- OpenCL 内核计时测量 0 秒或导致 SIGABRT
- 给定使用 C++ 或 C,我如何测量在 linux 下进行线程切换需要多长时间?可能吗?
- 使用 Qt 测量过程的实际运行时间
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- V8垃圾收集器回调,用于测量GC活动
- 测量精确的时间,单位为纳秒C++
- 如何测量cudaMalloc执行时间
- C/C++memcpu基准测试:测量CPU和墙时间
- 如何测量一个音频样本中的低音量
- 为什么时间测量有时会返回重复值(15.625ms 的倍数)?