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

时间:2014-06-26 19:18:14

标签: c++ linux timer

我正在尝试使用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 个答案:

答案 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;
}