Skip to content
本博客自 2023 年 4 月 4 日起转为归档状态,可能不再发表新的博文。点此了解博主的竞赛生涯
This blog has been archived by the owner since April 4, 2023. It may no longer have new updates.

GNU time 简要使用教程

杂项约 1 千字
检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。

众所周知,Linux 系统的许多 Shell 中都内置了 time 命令,用于统计命令的运行资源消耗情况。但是,这个 Shell 内建命令的功能并不是很强大,甚至不能统计命令的内存使用情况。因此,如果要统计更加详细的某个命令的资源消耗情况,就需要使用 GNU time 命令了。

如果仅需要了解在 OI 中如何使用 GNU time 命令,可以直接跳到 OI 中的使用实例 一节。

#检测调用 time 命令的类型

在很多 Shell 中都内置了一个自己的 time 命令,我们可以通过键入 type time 的方式来检测直接输入 time 命令时调用程序的对象。

▲ /bin/bash

▲ /bin/zsh

▲ /bin/sh

可见,在常见的 Shell 中,只有 /bin/sh 调用的是 /usr/bin/time (GNU time) 命令,而其他 Shell 都命中了内建的 time 命令。

#对比

#GNU time 简要使用教程

#常用参数解释

使用 -v 选项获取全部详细信息。

使用 -o <file> 选项将结果输出到文件中,使用 -a 选项将信息追加到文件末尾而不是覆盖文件。

使用 --help 选项获取帮助信息。

#格式化输出

可以使用 -f <format> 选项格式化输出。下面提供了格式符的对照表:

#时间相关

格式符 描述
%E 进程执行所消耗的时间(格式为 [小时:]分钟:秒)。
%e 进程执行所消耗的时间(秒)。
%U 进程在用户态执行所消耗的时间(秒)。
%S 进程在内核态执行所消耗的时间(秒)。
%P 进程所获取的 CPU 时间百分比。计算公式为 (%U + %S) / %E

#内存相关

格式符 描述
%M 进程执行过程中所占用内存的最大值(kB)。
%t 进程执行过程中所占用内存的平均值(kB)。
%K 进程执行过程中所占用的内存总量(data + stack + text)的平均大小(kB)。
%D 进程执行过程中所占用的私有数据区(unshared data area)的平均大小(kB)。
%p 进程执行过程中所占用的私有堆栈(unshared stack)的平均大小(kB)。
%X 进程执行过程中共享内容(shared text)的平均大小(kB)。
%Z 系统内存页的大小(B)。这是一个系统常量,不同系统中该值不相同。
%F 进程执行过程中主要内存页发生错误的次数。
%R 进程执行过程中次要内存页发生错误的次数。
%W 进程执行过程中被换出主要内存页的次数。
%c 进程被迫进行上下文切换的次数(由于时间片到期)。
%w 进程主动进行上下文切换的次数,例如等待 I/O 操作完成。

#I/O 相关

格式符 描述
%I 进程执行过程中读取的文件数。
%O 进程执行过程中写入的文件数。
%r 进程执行过程中接收的 socket message 的数量。
%s 进程执行过程中发送的 socket message 的数量。
%k 进程接收到的信号数量。
%C 进行计时的命令名称和命令行参数。
%x 命令退出状态。

#OI 中的使用实例

在 OI 中我们比较关心的是程序的实际运行时间和峰值内存使用情况,因此我们可以使用如下命令来统计程序的运行时间和内存使用情况(请将 ./a.out 替换为你实际需要执行的命令):

BASH
1
/usr/bin/time -f "Time: %e s\nMemory: %M KB" ./a.out

如果在赛场上忘记了使用方法,也可以通过 /usr/bin/time --help 或者 man 1 time 来获取帮助文档(英文)。对于 OI 赛场上的使用并不需要记住那么多的详细参数,只需要记住上面的命令即可。下面是一个使用示例:

#参考资料

  • time(1)

感谢石家庄二中实验学校的李昊森同学审阅本文,并对「OI 中的使用实例」一节提出了一些建设性意见。