bash 中类似环境中调用不同的 'time

bash 中类似环境中调用不同的 'time

有人告诉我,使用 bash 的人必须区分 shell 内置命令time/usr/bin/time( time(1))。我必须对程序进行计时,还必须找到自动输入、使用echo字符串重定向的方法<<<。这些是结果,

$ time python3 -c "a=input("");print(a)" <<< "12"
12

real    0m0.023s
user    0m0.020s
sys 0m0.000s

在这种情况下调用 shell 内置函数。

$ echo "12" | time python3 -c "a=input("");print(a)"
12
0.01user 0.00system 0:00.02elapsed 100%CPU (0avgtext+0avgdata 6524maxresident)k
0inputs+0outputs (0major+593minor)pagefaults 0swaps

time(1)在这种情况下被调用。

为什么会出现这种情况?他们的环境不同吗?

使用 Ubuntu 14.04 x86_64

答案1

管道的结构不允许中间有时间,只允许在管道的开始处有时间。

另外,时间是一个“shell 关键字”,如 所示type time

但没有什么禁止使用复合命令(以及每次的时间):

time comm1 | ( time comm2 )

因此,您可以使用子 shell 来解决此问题,如下所示:

echo "12" | ( time python3 -c "a=input("");print(a)" )

或者也可以这样:

echo "12" | { time python3 -c "a=input("");print(a)"; }

答案2

有两种类型的time命令。一种是shell内置的,属于bash。这就是您在第一个示例中看到的。第二个,是/usr/bin/time,这是你看到的第二个。至于为什么输出不同,这是因为您无法将输出通过管道传输到 shell 内置函数。 更多相关内容请点击这里

答案3

如果您出于性能原因喜欢对命令进行计时,我建议不要使用 /usr/bin/time 而是使用 ptime(1)(如果您的平台上可用) - ptime 提供纳秒分辨率 - 或者使用最新的 Bourne Shell,如Bourne Shell 允许在所有现代操作系统上以微秒分辨率自动计时所有前台命令(包括 shell 内置命令)。要对 Bourne Shell 中的所有前台命令进行计时,请调用:set -o time并将 TIMEFORMAT 设置为有用的内容以获得更高分辨率,例如:%6:E real %6U user %6S sys %P%% cpu %I+%Oio %Fpf+%Ww

/usr/bin/time 通常具有 10ms 或 1ms 的固定分辨率。

相关内容