我想知道运行脚本的最快方法是什么,我一直在阅读,在终端上显示脚本输出,将脚本重定向到文件或两者之间,速度存在差异/dev/null
。
因此,如果输出不重要,那么即使脚本很小,也可以使脚本更快地工作的最快方法是什么。
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
我想知道运行脚本的最快方法是什么,我一直在阅读,在终端上显示脚本输出,将脚本重定向到文件或两者之间,速度存在差异/dev/null
。
因此,如果输出不重要,那么即使脚本很小,也可以使脚本更快地工作的最快方法是什么。
bash ./myscript.sh
-or-
bash ./myscript.sh > myfile.log
-or-
bash ./myscript.sh > /dev/null
Answers:
如今的终端比过去要慢,主要是因为图形卡不再关心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
在xterm
260x78中:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done)
real 0m1.367s
user 0m0.507s
sys 0m0.104s
重定向到三星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
重定向到/dev/null
:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >/dev/null)
real 0m0.448s
user 0m0.432s
sys 0m0.016s
timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"
在一秒钟内在我的MBP上打印100000+行。)
xterm
相比,30年前的HP Apollo上的s曾经爬网xterms
。但是,使用15年前的Matrox视频卡的Linux控制台要比使用20年前的S3卡的Linux控制台慢。在现代卡上具有高分辨率帧缓冲区的Linux控制台根本无法使用。:)
我本能地同意Katsura Katsura的回答;这说得通。但是,它很容易测试。
我测试了在屏幕上写入一百万行,写入(追加)到文件,然后重定向到/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)
然后,我在下面绘制了总时间。
如您所见,SatōKatsura的假设是正确的。根据Satō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)
正如John Kugelman在评论中指出的那样,这增加了很多开销。从问题的角度来看,这并不是测试它的正确方法,但我将其保留在此处,因为它清楚地表明了从脚本本身内部重复打开文件的成本。
在这种情况下,结果相反。
xterm
,而Linux控制台要比Linux慢3倍左右/dev/null
。
加快脚本速度的另一种方法是使用更快的shell解释器。一个比较的速度POSIX繁忙的循环,下运行bash
V4.4,ksh
v93u + 20120801,和dash
v0.5.8。
bash
:
time echo 'n=0;while [ $n -lt 1000000 ] ; do \
echo $((n*n*n*n*n*n*n)) ; n=$((n+1));
done' | bash -s > /dev/null
输出:
real 0m25.146s
user 0m24.814s
sys 0m0.272s
ksh
:
time echo 'n=0;while [ $n -lt 1000000 ] ; do \
echo $((n*n*n*n*n*n*n)) ; n=$((n+1));
done' | ksh -s > /dev/null
输出:
real 0m11.767s
user 0m11.615s
sys 0m0.010s
dash
:
time echo 'n=0;while [ $n -lt 1000000 ] ; do \
echo $((n*n*n*n*n*n*n)) ; n=$((n+1));
done' | dash -s > /dev/null
输出:
real 0m4.886s
user 0m4.690s
sys 0m0.184s
一个子集,在命令bash
和ksh
是向后兼容所有的命令dash
。一个bash
只有该子集中使用的命令脚本应该一起工作dash
。
某些bash
使用新功能的脚本可以转换为另一个解释器。如果bash
脚本严重依赖于较新的功能,则可能不值得花时间去做- 一些新bash
功能是改进,既易于编写,也更有效(尽管bash
通常较慢),因此dash
等效项(可能涉及运行)其他几个命令),速度会变慢。
如有疑问,请进行测试...