我正在尝试使用clock_gettime()来监视已用时间。但是它会返回不好的结果。
我测试了以下内容:
#include <time.h>
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
// Time vars for calculation.
int ns;
// Initial struct.
timespec tt;
// Get starting time.
clock_gettime(CLOCK_MONOTONIC,&tt);
int ns_start = tt.tv_nsec;
int s_start = tt.tv_sec;
// Base for second wrap around.
int ns_base = 1000e6 - ns_start;
while(true)
{
cin.ignore();
// Get time.
clock_gettime(CLOCK_MONOTONIC,&tt);
// Implement/calculate wrap around.
if(tt.tv_nsec >= ns_start) ns = tt.tv_nsec - ns_start;
else ns = tt.tv_nsec + ns_base;
// Display result.
cout << "Time Passed:\ts: " << tt.tv_sec-s_start << " ms: " << round(ns/1e6) << endl;
}
return 0;
}
当我按住任何键一段时间后,我得到了类似的结果:
Time Passed: s: 1 ms: 833
Time Passed: s: 2 ms: 308
Time Passed: s: 2 ms: 354
Time Passed: s: 2 ms: 415
Time Passed: s: 2 ms: 459
Time Passed: s: 2 ms: 511
Time Passed: s: 2 ms: 566
Time Passed: s: 2 ms: 613
Time Passed: s: 2 ms: 661
Time Passed: s: 2 ms: 712
Time Passed: s: 2 ms: 762
Time Passed: s: 2 ms: 813
Time Passed: s: 2 ms: 861
Time Passed: s: 2 ms: 920 // crap starts here
Time Passed: s: 3 ms: 970
Time Passed: s: 3 ms: 20
Time Passed: s: 3 ms: 69
Time Passed: s: 3 ms: 124
Time Passed: s: 3 ms: 171
Time Passed: s: 3 ms: 226
Time Passed: s: 3 ms: 272
Time Passed: s: 3 ms: 329
Time Passed: s: 3 ms: 372
Time Passed: s: 3 ms: 429
Time Passed: s: 3 ms: 474
Time Passed: s: 3 ms: 528
Time Passed: s: 3 ms: 576
Time Passed: s: 3 ms: 632
Time Passed: s: 3 ms: 679
Time Passed: s: 3 ms: 736
Time Passed: s: 3 ms: 782
Time Passed: s: 3 ms: 835
Time Passed: s: 3 ms: 880
Time Passed: s: 4 ms: 939
Time Passed: s: 4 ms: 982
Time Passed: s: 4 ms: 38
Time Passed: s: 4 ms: 84
Time Passed: s: 4 ms: 143
Time Passed: s: 4 ms: 188
Time Passed: s: 4 ms: 244
Time Passed: s: 4 ms: 291
Time Passed: s: 4 ms: 348
Time Passed: s: 4 ms: 391
Time Passed: s: 4 ms: 448
Time Passed: s: 4 ms: 493
Time Passed: s: 4 ms: 549
Time Passed: s: 4 ms: 594
Time Passed: s: 4 ms: 650
Time Passed: s: 4 ms: 696
Time Passed: s: 6 ms: 259
Time Passed: s: 7 ms: 989
通过查看结果在评论点被搞砸的数字应该是显而易见的。
任何人都有任何想法,为什么这是以及如何解决它?
答案 0 :(得分:1)
想象一下计时器从1.999秒开始。在2.001秒,你的代码会说1秒和2毫秒已经过去,真的应该是零秒和2毫秒。这是因为你要从当前秒中减去起始秒,即使纳秒部分没有超过其起始值。
你对纳秒环绕有了正确的想法。让我们扩展它以防止秒数超过正确的值。这是一种方法:
#include <time.h>
#include <iostream>
#include <math.h>
using namespace std;
int main()
{
// Time vars for calculation.
int ns;
int s;
// Initial struct.
timespec tt;
// Get starting time.
clock_gettime(CLOCK_MONOTONIC,&tt);
int ns_start = tt.tv_nsec;
int s_start = tt.tv_sec;
// Base for second wrap around.
int ns_base = 1000e6 - ns_start;
while(true)
{
cin.ignore();
// Get time.
clock_gettime(CLOCK_MONOTONIC,&tt);
// Implement/calculate wrap around.
if(tt.tv_nsec >= ns_start)
{
ns = tt.tv_nsec - ns_start;
s = tt.tv_sec - s_start;
}
else
{
ns = tt.tv_nsec + ns_base;
s = tt.tv_sec - s_start - 1;
}
// Display result.
cout << "Time Passed:\ts: " << s << " ms: " << round(ns/1e6) << endl;
}
return 0;
}