【问题标题】:How to record elaspsed wall time in C?如何在C中记录经过的墙壁时间?
【发布时间】:2017-02-04 23:11:13
【问题描述】:

我正在尝试以亚秒级的精度记录我的程序完成所需的时间。

我没有记录 CPU 时间或周期,我只是希望能够标记一个起点(挂钟时间),然后在我的程序结束时标记一个结束(挂钟时间),并计算增量.

【问题讨论】:

  • 什么操作系统?
  • 您尚未接受任何答案。如果您在其中一个答案(解决您的问题的答案,如果有的话)上单击 √,您将获得声誉积分,并且还会使帮助您解决问题的人受益/信用。请参阅2 Minute Tour,了解问答和代表系统的工作原理。

标签: c time clock


【解决方案1】:

看看函数:

   int clock_gettime(clockid_t clk_id, struct timespec *tp);

该函数将填充您提供的结构struct timespec。这是它的定义:

struct timespec {
    time_t   tv_sec;        /* secondes */
    long     tv_nsec;       /* nanosecondes */
};

所以返回的时间以纳秒为单位:tp->tv_sec * 1e9 + tp->tv_nsec

您可以在man 中找到所有可能的clk_id。我建议您使用CLOCK_MONOTONIC,因为它可以保证给定的时间将始终是连续的,即使系统的时间被修改。

【讨论】:

  • 所以我需要定义这个 timespec 结构体?
  • 我通常更喜欢获得更精确的时间并根据需要进行四舍五入/转换。但对于基本情况,time_t 就足够了。
  • 这个struct timespec 已经在time.h 中定义(不要忘记包含它)
【解决方案2】:

只需调用time(NULL)获取当前时间并使用difftime计算两点之间的时间。

#include <time.h>
// ...

time_t start = time(NULL);
// do stuff here
time_t end = time(NULL);
printf("Took %f seconds\n", difftime(end, start));

【讨论】:

  • @Breeduss 这件事用了不到一秒钟吗?
【解决方案3】:

这会显示开始/结束时间戳并以秒为单位计算增量。

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

void print_timestamp(char *, time_t);

int main (int argc, char *argv[]) {
    time_t start = time(0);
    print_timestamp("Start:  ", start);

    sleep(2);

    time_t end   = time(0);
    print_timestamp("End:    ", end);

    double diff = difftime(end, start);

    printf("Elapsed: %5.2lf seconds\n", diff);
}

void
print_timestamp(char *msg, time_t time) {
    struct tm *tm;
    if ((tm = localtime (&time)) == NULL) {
        printf ("Error extracting time stuff\n");
        return;
    }
    printf ("%s %04d-%02d-%02d %02d:%02d:%02d\n",
        msg, 
        1900 + tm->tm_year, 
        tm->tm_mon+1, 
        tm->tm_mday,
        tm->tm_hour, 
        tm->tm_min, 
        tm->tm_sec);
}

样本输出:

Start:   2017-02-04 15:33:36  
End:     2017-02-04 15:33:38  
Elapsed: 2.00 seconds

【讨论】:

    【解决方案4】:

    您还可以使用(至少)Unix 系统上可用的time 命令。

    编译你的程序后,运行如下命令:

    # compile your code
    $ gcc foo.c -o foo
    # compute the time
    $ time ./foo
    

    【讨论】:

      【解决方案5】:

      您可以使用clock() 函数记录所用的滴答数,然后将其转换为秒数:

      #include <time.h>
      #include <stdio.h>
      #include <math.h>
      
      int main () {
         clock_t start_t = clock();
      
         double a=0;
         for(int i=0; i< 10000000; i++) {
           a+=sqrt(a);
         }
      
         clock_t end_t = clock();
      
         double total_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
         printf("Total time taken by CPU: %lf\n", total_t  );
      
         return(0);
      }
      

      【讨论】:

      • 问题是关于挂墙时间而不是 CPU 时间。
      猜你喜欢
      • 1970-01-01
      • 2011-08-25
      • 2022-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      相关资源
      最近更新 更多