C 如何缩短测量时差的时间量?
我试图测量用户的反应时间。我的代码如下所示:C 如何缩短测量时差的时间量?,c,windows,C,Windows,我试图测量用户的反应时间。我的代码如下所示: int clocks2ms(clock_t range) { return (int)((double)range*1000/CLOCKS_PER_SEC); } clock_t start = clock(); // start measuring while(!kbhit()); // wait for keypress int reaction = clocks2ms(clock()-start); // measure reaction
int clocks2ms(clock_t range) {
return (int)((double)range*1000/CLOCKS_PER_SEC);
}
clock_t start = clock(); // start measuring
while(!kbhit()); // wait for keypress
int reaction = clocks2ms(clock()-start); // measure reaction
反应时间为186ms(+-1ms)、201ms、216ms等,因此存在相等的15ms间隙。有没有办法缩短差距?我试着以实时优先级运行它
start "test" /Realtime "test.exe"
但一切都没有改变。我希望获得1ms的精度。您必须使用精度更高的计时器,如
GetPerformanceCounter()
():
请注意,在上面的示例代码中,我省略了对
查询…
函数的错误检查。您必须使用精度更高的计时器,如GetPerformanceCounter()
():
请注意,在上面的示例代码中,我省略了对
Query…
函数的错误检查。如果kbhit()
的时间分辨率是问题所在,那么您可以尝试以下几种替代方法:
kbhit()
函数实际上是一个函数,因此使用\u kbhit()
函数可能会获得更好的结果ncurses
编译项目,则有一个getch()
函数可以在不等待返回键的情况下获取字符如果
kbhit()
的时间分辨率是这里的问题,那么您可以尝试以下几种方法:
kbhit()
函数实际上是一个函数,因此使用\u kbhit()
函数可能会获得更好的结果ncurses
编译项目,则有一个getch()
函数可以在不等待返回键的情况下获取字符获得更精确答案的两种方法 同步启动。与其在一个时钟滴答响的时间内开始某个地方,不如在一次改变后立即开始。这通常会减少启动的“抖动”。这个想法比2更好——它没有得到更精确的答案,但确实提高了准确性
clock_t prestart = clock();
clock_t start,end;
while((start = clock()) == prestart); //
puts("Hit Any Key");
fflush(stdout);
while(!kbhit()); // wait for keypress
end = clock();
int reaction = clocks2ms(end-start);
结束采样后的时钟周期。这可能会提高精度,但取决于系统的稳定性,也就是说还有多少其他处理在进行
unsigned count = 0;
...
while(!kbhit()); // wait for keypress
end = clock();
while(end == clock()) count++;
int reaction = clocks2ms(end + (max_cnt_per_tck-count)/max_cnt_per_tck - start);
当然,这两种方法都不如@uesp所建议的使用更高精度时钟。它们会受到系统实时性方面的影响,例如打印时间的不一致性(
print()
),或者此线程的代码之间可能发生的中断。但是,当没有更精确的时间来源时,它们确实提供了一些改进。2获得更精确答案的方法
同步启动。与其在一个时钟滴答响的时间内开始某个地方,不如在一次改变后立即开始。这通常会减少启动的“抖动”。这个想法比2更好——它没有得到更精确的答案,但确实提高了准确性
clock_t prestart = clock();
clock_t start,end;
while((start = clock()) == prestart); //
puts("Hit Any Key");
fflush(stdout);
while(!kbhit()); // wait for keypress
end = clock();
int reaction = clocks2ms(end-start);
结束采样后的时钟周期。这可能会提高精度,但取决于系统的稳定性,也就是说还有多少其他处理在进行
unsigned count = 0;
...
while(!kbhit()); // wait for keypress
end = clock();
while(end == clock()) count++;
int reaction = clocks2ms(end + (max_cnt_per_tck-count)/max_cnt_per_tck - start);
当然,这两种方法都不如@uesp所建议的使用更高精度时钟。它们会受到系统实时性方面的影响,例如打印时间的不一致性(print()
),或者此线程的代码之间可能发生的中断。但当没有更精确的时间来源时,它们确实提供了一些改进