【问题标题】:How accurate is the Linux bash time command?Linux bash time 命令的准确性如何?
【发布时间】:2020-10-12 09:56:39
【问题描述】:

我想在 bash 脚本的日志文件中为一些事件添加时间戳。我需要这个时间戳尽可能准确。我看到从 bash 执行此操作的标准方法似乎是 time 命令,它可以使用 +%s%N 选项生成纳秒时间戳。

但是,当我从 C 中执行此操作时,我记得多个计时函数具有多个时钟源,并且并非所有它们都同样准确或具有相同的保证(例如单调)。我怎么知道time使用什么时钟源?

【问题讨论】:

  • 您阅读手册页了吗?
  • 是的,我做到了。它说了很多关于用法,而不是关于内部工作原理。
  • 没有?就像字面上的the sum of the tms_utime and tms_cutime values in a struct tms as returned by times(2)
  • man 是什么?我在man7.org/linux/man-pages/man1/date.1.html 上读过它并没有那行!
  • 但是man 1 time 有! Sections in manpages 很重要

标签: linux bash time sh


【解决方案1】:

man 1 time 比较清楚:

这些统计数据包括 (i) 之间经过的实时时间 调用和终止,(ii) 用户 CPU 时间(结构 tms 中的 tms_utime 和 tms_cutime 值的总和,由 times(2)) 和 (iii) 系统 CPU 时间(由 次(2))。

所以我们可以转到man 3p times 那里只是状态The accuracy of the times reported is intentionally left unspecified to allow implementations flexibility in design, from uniprocessor to multi-processor networks. 所以我们可以转到man 2 times,并了解到它都是用clock_t 测量的,也许我们应该改用clock_gettime

我如何知道使用什么时钟源时间?

通常在 GNU 系统上,所有程序都是开源的。所以你去下载内核的源代码,然后你壳并检查它们以查看它是如何工作的。我在bash time_command() 中看到有很多可用的方法,现在bash 使用rusage 作为times 的替代品。

Linux bash time 命令的准确度如何?

getrusage()times() 都是 system calls by themselfs,因此这些值直接从内核返回。我的猜测是,它们是按照内核可以提供给我们的准确度来测量的 - 所以使用 jiffies/HZ

测量的分辨率将等于 jiffies,所以如果我的数学是正确的,通常使用 300 HZ 那就是 3.333ms。 准确度将取决于您的硬件,也可能取决于工作负载 - 我高估的猜测是,这些值会达到一到两个 jiffies 的准确度,因此最多约为 7 毫秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2016-05-19
    • 1970-01-01
    相关资源
    最近更新 更多