$ time time time time time time time time time time time time time time time time time time time time true true
real:0m0.000s user:0m0.000s sys:0m0.000s
这里有 1000 个:
$ eval $(for i in $(seq 1 1000); do printf "time "; done) true
real:0m0.000s user:0m0.000s sys:0m0.000s
time
您可以通过将其包装到另一个中来测试需要多少time
:注意:我添加
true
的是“什么都不做”的简单命令。在我的身上,它显示:
即使出现 20 次:
这里有 1000 个:
man time
提供了一些如何计算时间的线索:有关更多技术细节,请查看:
man 2 wait3
或man wait4
。time
要在 Linux 上调试,您可以使用strace
,例如要计算系统调用
-c
的时间 ( ) 并总结时间差 (-s
),请运行:以下是如何调试
time
10 次:1000次:
显然在调试器下运行,运行实际命令的时间会慢一些,但它可以大致了解正在使用什么样的系统调用以及与其他相比它们可以使用多少时间。
初步说明
有时很容易混淆
time
实用程序。您明确询问了“shell关键字time
”。代码
以下代码将运行测量
true
(它是 Bash 中内置的 shell)n次,然后不测量true
相同的次数。减去相应的结果并除以n。例子
因为
n=10000000
我分别得到:各自的区别:
每人
time
:分析
这些取决于操作系统的一般和临时速度,因此您的结果会有所不同。我的测试平台是一台配备 i7 CPU、Kubuntu 18.04.3 LTS、Bash 4.4.20 的笔记本电脑。我也有一台速度较慢的计算机作为家用路由器/服务器。结果就像
36μs
,21μs
,15μs
. 现在您知道预期的幅度了。我还测试了不同的n值。总时间表现出良好的线性。换句话说,“每个人
time
”的结果不依赖于n。关于我的代码,这是意料之中的。结论
time
在我的 Bash 中提供分辨率为 1 毫秒的测量。即使在相对较慢的计算机上,开销也要小 20 倍以上。我会说它可以忽略不计。奖金
另一个
time
呢?在我的笔记本电脑上,我
time
在循环中替换为/usr/bin/time
(并且true
在/bin/true
两行中都替换为,因为/usr/bin/time true
无法使用true
内置函数)。这些是(有些四舍五入的)每一个/usr/bin/time
获得的结果n=100000
:外部可执行文件比内置文件慢大约 100 倍。实际上,单次调用
/usr/bin/time
可能需要更长的时间,因为操作系统可能需要从 HDD 读取可执行文件。然后文件被缓存,所以在我的人工测试中,循环的其余部分受益,如果n足够大,这个初始延迟将变得微不足道。相比之下
time
,Bash 提供的即使在第一次运行时也应该同样快,因为bash
已经加载(虽然我还没有测试过)。回到
/usr/bin/time
。我预计在较慢的机器上开销很容易超过 1 毫秒。原则上,时间只不过是等待子进程完成(字面意思是
wait3()
完全停止执行time
自己的进程的调用),然后向内核询问子进程的资源使用情况统计信息。所以实际上time
对子进程的运行时间没有影响。这些统计数据似乎总是被收集。似乎没有“开始监控”模式或会减慢子进程的东西。我在这里使用“似乎”,因为我无法查看代码,也找不到明确证实这一点的来源。
来源/这个兔子洞的入口:http: //man7.org/linux/man-pages/man2/wait4.2.html