我想知道运行脚本的最快方法是什么,我一直在读到在终端上显示脚本的输出与将其重定向到文件或/dev/null
.
因此,如果输出不重要,那么让脚本更快地工作的最快方法是什么,即使它是 minim 。
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Run Code Online (Sandbox Code Playgroud)
Sat*_*ura 32
现在的终端比以前慢了,主要是因为显卡不再关心 2D 加速。因此,确实,打印到终端会减慢脚本速度,尤其是在涉及滚动时。
因此./script.sh
比./script.sh >script.log
慢/script.sh >/dev/null
,后者又比 慢,因为后者涉及的工作较少。然而,这是否对任何实际目的产生足够的影响取决于您的脚本产生多少输出以及多快。如果您的脚本写了 3 行并退出,或者它每隔几个小时打印 3 页,您可能不需要为重定向而烦恼。
编辑:一些快速(且完全损坏)的基准测试:
在 Linux 控制台中,240x75:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done)
real 3m52.053s
user 0m0.617s
sys 3m51.442s
Run Code Online (Sandbox Code Playgroud)在xterm
, 260x78 中:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done)
real 0m1.367s
user 0m0.507s
sys 0m0.104s
Run Code Online (Sandbox Code Playgroud)重定向到三星 SSD 850 PRO 512GB 磁盘上的文件:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >file)
real 0m0.532s
user 0m0.464s
sys 0m0.068s
Run Code Online (Sandbox Code Playgroud)重定向到/dev/null
:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >/dev/null)
real 0m0.448s
user 0m0.432s
sys 0m0.016s
Run Code Online (Sandbox Code Playgroud)Spa*_*awk 13
我会本能地同意周六吗?桂的回答;这说得通。但是,它很容易测试。
我测试了向屏幕写入一百万行,写入(附加)到文件,并重定向到/dev/null
. 我依次测试了每一个,然后做了五次重复。这些是我使用的命令。
$ time (for i in {1..1000000}; do echo foo; done)
$ time (for i in {1..1000000}; do echo foo; done > /tmp/file.log)
$ time (for i in {1..1000000}; do echo foo; done > /dev/null)
Run Code Online (Sandbox Code Playgroud)
然后我绘制了下面的总时间。
如你所见,周六?桂的推测是正确的。按照周六?Katsura 的回答,我也怀疑限制因素是输出,所以输出的选择不太可能对脚本的整体速度产生实质性影响。
FWIW,我原来的答复有不同的代码,其中有文件追加和/dev/null
重定向内循环。
$ rm /tmp/file.log; touch /tmp/file.log; time (for i in {1..1000000}; do echo foo >> /tmp/file.log; done)
$ time (for i in {1..1000000}; do echo foo > /dev/null; done)
Run Code Online (Sandbox Code Playgroud)
正如 John Kugelman 在评论中指出的那样,这增加了很多开销。就问题而言,这并不是测试它的真正正确方法,但我将把它留在这里,因为它清楚地显示了从脚本本身内重复重新打开文件的成本。
在这种情况下,结果相反。