【问题标题】:most efficient way to get current time/date/day in C在 C 中获取当前时间/日期/日期的最有效方法
【发布时间】:2011-03-25 01:51:27
【问题描述】:

在 C 语言中获取当前时间/日期/日期/年份的最有效方法是什么?由于我必须多次执行此操作,因此我需要一种真正有效的方法。 我在 freeBSD 上。

提前致谢。

【问题讨论】:

  • 您是否分析过您的代码并发现访问日期/时间是瓶颈?
  • 是的,丹尼尔。我在尝试通过从 awk 脚本调用 'date' cmd 来获取当前日期时发现了这个问题。那件作品被调用的频率很高,而且有点贵。只需尝试在 shell 脚本中循环调用“date”cmd 10000 次,您就会意识到。这就是我尝试用 C 而不是 awk 编写该模块的原因。谢谢。
  • 如果您使用的是 GNU awk,那么您可以使用 strftime() 内置 awk 函数,而不是使用外部命令。
  • 感谢咖啡馆,我正在使用 NAWK。我不认为 strftime 在那里可用。您是否知道 NAWK 中的任何其他替代方案?
  • 我不相信有 - 最简单的解决方案可能只是安装 gawk

标签: c freebsd systemtime processing-efficiency


【解决方案1】:
/* ctime example */
#include <stdio.h>
#include <time.h>

int main ()
{
  time_t rawtime;

  time ( &rawtime );
  printf ( "The current local time is: %s", ctime (&rawtime) );

  return 0;
}

如果你需要它作为字符串,你可以使用ctime

【讨论】:

    【解决方案2】:

    标准 C 仅提供一种获取时间的方法 - time() - 可以使用 localtime()gmtime() 将其转换为时间/日期/年份。如此琐碎,这一定是最有效的方法。

    任何其他方法都是特定于操作系统的,您还没有告诉我们您使用的是什么操作系统。

    【讨论】:

    • 非常感谢。我在 freeBSD 上。
    • 如果您担心gmtimelocaltime 运行缓慢,您只需调用它们一次,然后根据从time 获得的以秒为单位的增量值调整结果。就 POSIX 而言,这是可移植的,但不是纯 C,因为纯 C 没有指定 time_t 类型的格式,只是它是一种算术类型。
    【解决方案3】:

    这真的取决于你所说的“很多”是什么意思:-)

    我想您可能会发现使用 ISO 标准 time()localtime() 函数已经足够快了。例如,在我的"Intel(R) Core(TM)2 Duo CPU E6850 @ 3.00GHz" 上,使用未优化的代码,我可以在 1.045 秒内调用 time() 一千万次,在 0.98 秒内调用 time()/localtime() 组合一百万次。这是否足以满足您的需求,只有您可以决定,但我很难想出一个需要比这更多的用例。

    time() 函数为您提供自纪元以来的秒数,而 localtime() 将其转换为本地时间(从 UTC 开始)并将其拆分为更可用的形式,struct tm 结构。

    #include <time.h>
    time_t t = time (NULL);
    struct tm* lt = localtime (&t);
    // Use lt->tm_year, lt->tm_mday, and so forth.
    

    任何尝试缓存日期/时间并使用其他方法来找出应用到它的增量,例如使用clock(),几乎都会:

    • 慢一点;和
    • 您不会接受外部时间更改这一事实。

    【讨论】:

    • 当然,如果很多意味着 100 次/秒 - 那么您可以缓存响应并检查 time() 是否每 100 次调用发生变化
    • @Martin,这很好,直到他的进程由于大量系统负载而被切换一秒钟:-)
    • @Martin:唯一的问题是,除非您确定每秒会调用很多次,否则很容易最终返回陈旧数据。
    • time() 的分辨率只有一秒,因此运行 100Hz 的进程不太可能关心是否有 10% 的值被前一秒标记
    【解决方案4】:

    最简单的是

    #include <time.h>
    //...
    time_t current_time = time (NULL);
    struct tm* local_time = localtime (&current_time); 
    printf ("the time is %s\n", asctime (local_time));
    

    【讨论】:

      【解决方案5】:

      您可以使用 gettimeofday() 函数以秒和微秒为单位获取时间,这(我认为)非常快(因为 Linux 内核 do_gettimeofday() 中有类似的函数),然后您可以将其转换为所需的格式(或许可以使用上面提到的函数进行转换。

      我希望这会有所帮助。

      【讨论】:

        【解决方案6】:

        唯一的方式(无论如何都是标准的)是调用time,然后调用localtimegmtime

        【讨论】:

        • 我看不出最直接的回应有什么问题。他已经在 C 中工作的事实非常有用,这里唯一的打击是时间系统调用?
        【解决方案7】:

        嗯,一般来说,直接访问操作系统的 API 来获取时间可能是最有效的,但不是那么便携.....

        C 时间函数没问题。

        但真的取决于你的平台

        【讨论】:

          【解决方案8】:

          假设一秒钟的分辨率就足够了,FreeBSD(或任何 POSIX 系统)上最有效的方法可能是

          • 使用setitimer (ITIMER_REAL, ...) 安装一秒间隔计时器
          • 当它触发SIGALRM时,更新一个保存当前时间的静态变量
          • 在需要时使用静态变量中的值

          即使信号由于系统过载而丢失,这也会在下一次安排进程时自行纠正。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-03-22
            • 2015-10-29
            • 1970-01-01
            • 1970-01-01
            • 2011-10-18
            • 2020-01-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多