【问题标题】:How to printf a time_t variable as a floating point number?如何将 time_t 变量打印为浮点数?
【发布时间】:2023-03-04 18:12:02
【问题描述】:

我在 C(openMP 环境)中使用 time_t 变量来保持 cpu 执行时间...我定义了一个浮点值 sum_tot_time 来对所有 cpu 的时间求和...我的意思是 sum_tot_time 是 cpu 的 time_t 值的总和。问题是打印值 sum_tot_time 它显示为整数或长整数,顺便说一下没有小数部分!

我尝试了以下方法:

  1. 将 printf sum_tot_time 作为双精度值作为双精度值
  2. printf sum_tot_time as float 是一个浮点值
  3. 将 printf sum_tot_time 作为双精度值作为 time_t 值
  4. 将 printf sum_tot_time 作为浮点数作为 time_t 值

【问题讨论】:

  • 你为什么假设你的 time_t 的总和会有小数部分?
  • 各位,非常感谢你们的帮助。我也会回答不。我正在使用具有共享内存的并行 cpu 编写例程。我需要检查一个两个或多个 cpu 或内核的执行时间。考虑到毫秒对于区分效率非常重要。我在并行区域之前和之后使用了 2 omp_get_wtime() 之间的差异。该函数返回一个双精度浮点值,该值等于自某个“过去时间”以来经过的挂钟时间(以秒为单位),在应用程序执行期间不会更改。

标签: c time parallel-processing openmp time-t


【解决方案1】:

time_t 的分辨率在大多数平台上最多为一秒。也就是说,在大多数平台上,time_t 是一个整数(32 位或 64 位)值,计算自 1970 年 1 月 1 日(UTC)午夜以来经过的秒数,并且只能实现一秒分辨率。

因此,time_t 值的总和也只会显示一秒的分辨率(没有小数部分,即使在转换为 double 之后也是如此。)

上面已经说过,您使用什么本机或 OpenMP 调用来获取您尝试累积的 time_t 值?

如果使用本机 *nix getrusage() 调用来填写带有用户/内核时间的 rusage 结构(前提是您的平台支持),或者如果使用 gettimeofday() 来获取挂起时间,则同时使用tv_secstruct timevaltv_usec 字段生成 double 值(通常为毫秒或更佳分辨率),并在计算中使用它而不是 time_t

struct timeval {
        time_t          tv_sec;         /* seconds */
        suseconds_t     tv_usec;        /* microseconds */
};

相应地,您可以使用GetThreadTimes/GetProcessTimes 用于用户/内核时间或_ftime 用于Windows 平台上的墙上时间,然后组合FILETIME::dwHighDateTime/dwLowDateTime

【讨论】:

    【解决方案2】:

    我不确定您是否可以访问标准 *nix 系统调用(或者这是否与您正在做的事情特别相关),但如果您可以使用 timeval structgettimeofday。例如,要打印出精确到小数点后六位的时间戳,它会生成 tcpdump 样式的时间戳 (courtesy of Steven UNP)

    #include    "unp.h"
    #include    <time.h>
    
    char *
    gf_time(void)
    {
        struct timeval  tv;
        time_t          t;
        static char     str[30];
        char            *ptr;
    
        if (gettimeofday(&tv, NULL) < 0)
            err_sys("gettimeofday error");
    
        t = tv.tv_sec;  /* POSIX says tv.tv_sec is time_t; some BSDs don't agree. */
        ptr = ctime(&t);
        strcpy(str, &ptr[11]);
            /* Fri Sep 13 00:00:00 1986\n\0 */
            /* 0123456789012345678901234 5  */
        snprintf(str+8, sizeof(str)-8, ".%06ld", tv.tv_usec);
    
        return(str);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-29
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多