clock_gettime()返回错误结果(VirtualBox上的Debian wheezy)

clock_gettime() returns bad results (Debian wheezy on VirtualBox)

本文关键字:VirtualBox 上的 wheezy 结果 Debian 返回 gettime clock 错误      更新时间:2023-10-16

我正在尝试使用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

从数字中可以明显看出,在注释处的结果是混乱的。

谁有任何想法,为什么这是和如何解决它?

假设计时器从1.999秒开始计时。在2.001秒时,代码会说已经过去了1秒2毫秒,而实际上应该是0秒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;
}