【问题标题】:clock_getres and clock_gettimeclock_getres 和 clock_gettime
【发布时间】:2012-02-19 17:36:17
【问题描述】:

我正在尝试使用 clock_getres 和 clock_gettime 以及 CLOCK_MONOTONIC 时钟来测量我的程序的一部分。

如果我理解正确,clock_gettime 通过测量某种外部时钟(不是 cpu)来获取经过的时间,并在他引用的 struct timespec 实例中更新它,作为参数。(即它返回结果以纳秒为单位)

我需要知道的不是实际时间,而是时钟 (CLOCK_MONOTONIC) 完成的周期数。

我该怎么做?这可能与clock_getres有关,但我不明白它是如何工作的。

有谁知道如何获得周期数?

【问题讨论】:

    标签: c++ linux


    【解决方案1】:

    Clock_gettime 为您获取纪元(或过去的某个其他固定时间,取决于您平台上的具体实现)和所选时钟的当前时间(在您的情况下为 CLOCK_MONOTONIC)之间的经过时间。

    要衡量一个过程需要多长时间,您需要调用它两次并计算差异。比如:

    int main()
    {
        timespec start, finish;
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
    
        //code you want to profile
    
        clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &finish);
    
        //calculate the difference between start and finish     
    
        return 0;
    }
    

    注意,这会给你一个时间值,如果你想知道 CPU 周期,那么你必须使用类似 rdtsc 的东西:

    #include <stdio.h>
    #include <intrin.h>
    
    #pragma intrinsic(__rdtsc)
    
    int main()
    {
        unsigned __int64 i;
        i = __rdtsc();
        printf_s("%I64d ticks\n", i);
    }
    

    【讨论】:

    • 谢谢,但这不是我问的。我不明白如何获得 CLOCK_MONOTONIC 所做的周期数。或者,clock_getres 做什么?这会给我那个时钟的频率吗?
    • CLOCK_MONOTONIC 不提供有关周期的任何信息,它为您提供时钟信息。改用 rdtsc(在 intrin.h 中)。 clock_getres 只是告诉你指定时钟的分辨率,这取决于你的平台。
    • 您可能不需要循环次数,因为现在大多数计算机都以可变速度运行(省电功能)。 clock_getres 只是获取它能够测量的最小时间增量(因此,理论上,这很可能是 1/频率,在实践中,我不知道,而且 POSIX 似乎还不清楚)
    • Jo So - 这就是我对 'clock_getres' 的看法。但正如你所说,它们并不清楚......
    • @Jo 因此,在实践中,Linux 操作系统从 clock_getres() 返回 1-10 毫秒(取决于 CONFIG_HZ 值;对于低分辨率时钟)或 1 纳秒(对于所有 @987654321 @)。
    猜你喜欢
    • 2023-03-14
    • 1970-01-01
    • 2012-06-23
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    相关资源
    最近更新 更多