关于时序测量的困惑

时间:2019-02-21 20:08:38

标签: c

我的任务是实现三个不同的函数get_current_time_seconds1、2和3,然后必须估计各种函数的分辨率。我怎么估计呢?

您建议使用哪个计时功能?当我必须使用gcc -O0 -lrt Timing.c -o Timing进行编译时,编译器选项-O0 -lrt是什么意思?

%include <windows.i>
%include <std_string.i>
%include <std_wstring.i>
... ...

1 个答案:

答案 0 :(得分:0)

  

我怎么估计呢?您建议使用哪种计时功能?

如果要获取各种计时元素的分辨率(精度),则可以使用clock_getres函数,传入各种CLOCK_ id类型,例如:

#include <stdio.h>
#include <time.h>

static void printres(clockid_t id)
{
    struct timespec ts;
    int rc = clock_getres(id, &ts);
    printf("clock id: %d\n", (unsigned int)id);
    if (rc != 0) {
        printf("Error: %d\n", rc);
        return;
    }
    printf("tv_sec = %lu\ntv_nsec = %lu\n", ts.tv_sec, ts.tv_nsec);
}

int main(int argc, char** argv)
{
    printres(CLOCK_REALTIME);
    printres(CLOCK_MONOTONIC);
    printres(CLOCK_PROCESS_CPUTIME_ID);
    printres(CLOCK_THREAD_CPUTIME_ID);
    return 0;
}

在我的系统上,tv_nsecCLOCK_THREAD_CPUTIME_ID以外的所有其他均为1000,对于CLOCK_THREAD_CPUTIME_ID的{​​{1}}的值为tv_nsec,这意味着其他时钟类型的精度为1毫秒(1000纳秒),而1的精度为1纳秒。

对于第一个调用localtime的函数,该精度为1秒,因为该函数以秒为单位计算从Unix时代开始的时间。

  

当我必须使用gcc -O0 -lrt Timing.c -o Timing进行编译时,编译器选项-O0 -lrt是什么意思?

对于某些CLOCK_THREAD_CPUTIME_IDgcc之类的编译器,选项clang表示在将代码编译到指定级别时优化代码,因此-O表示 not < / em>完全优化代码,这通常在调试代码时很有用。

-O0选项说可以针对指定的库进行编译,因此-l说可以使用-lrt库或“实时库”进行编译;在某些系统上这是必需的,因为可以在该库中定义rt

我希望能对您有所帮助。