运行脚本的最快方法是什么?

Kin*_*ech 21 linux bash

我想知道运行脚本的最快方法是什么,我一直在读到在终端上显示脚本的输出与将其重定向到文件或/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)

  • @Kingofkech 不到 200 行/秒。它不会有太大的不同。(作为比较,`timeout 1 yes "This is a looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong line"` 在一秒钟内在我的 MBP 上打印了 100000+ 行。) (6认同)
  • @Kingofkech 那大约是 2400 个基点。我们中的一些人实际上以这种速度生活了很多年。:) (6认同)
  • @Kingofkech 如果这是一个脚本,则编辑一个文件并注释掉打印不必要输出的行。你会收获很多,特别是如果这是一个执行了 300 万次的外部命令(不是 shell 内置的)...... (4认同)
  • 对于“曾经是”的狭义解释。vt220 终端比今天的终端模拟器慢得多。此外,SUN Sparc 工作站(我使用的那些)有一个非常慢的控制台,所以在编译一个更大的项目时将输出重定向到一个文件会大大加快编译时间。 (2认同)

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 在评论中指出的那样,这增​​加了很多开销。就问题而言,这并不是测试它的真正正确方法,但我将把它留在这里,因为它清楚地显示了从脚本本身重复重新打开文件的成本。

时间与输出图

在这种情况下,结果相反。