众所周知,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
替换为你实际需要执行的命令):
1 |
|
如果在赛场上忘记了使用方法,也可以通过 /usr/bin/time --help
或者 man 1 time
来获取帮助文档(英文)。对于 OI 赛场上的使用并不需要记住那么多的详细参数,只需要记住上面的命令即可。下面是一个使用示例:
#参考资料
- time(1)
感谢石家庄二中实验学校的李昊森同学审阅本文,并对「OI 中的使用实例」一节提出了一些建设性意见。