为什么读取 FILE 比读取 VARIABLE 更快?

Séb*_*ien 5 linux performance bash shell

我不明白我使用两个基本脚本(在高端服务器上运行)运行的简单性能测试的结果:

perfVar.zsh

#!/bin/zsh -f

MYVAR=`cat $1`
for i in {1..10}
do
  echo $MYVAR
done
Run Code Online (Sandbox Code Playgroud)

perfCat.zsh

#!/bin/zsh -f

for i in {1..10}
do
cat $1
done
Run Code Online (Sandbox Code Playgroud)

性能测试结果:

> time ./perfVar.zsh BigTextFile > /dev/null
./perfVar.zsh FE > /dev/null  6.86s user 0.32s system 100% cpu 7.177 total
> time ./perfCat.zsh BigTextFile > /dev/null
./perfCat.zsh FE > /dev/null  0.01s user 0.10s system 91% cpu 0.118 total
Run Code Online (Sandbox Code Playgroud)

我原以为访问 VARIABLE 比读取文件系统上的 FILE 快得多......为什么会出现这个结果?有没有办法通过减少对文件系统的访问次数来优化 perfCat.zsh 脚本?

小智 1

我能够在 Bash 中重现相同的行为。这里的主要问题是您使用 shell 变量的方式与它们的设计目的无关;因此没有优化。当您执行“echo $HUGEVAR”时,shell 必须构建一个包含 $HUGEVAR 全部内容的命令行(即使“echo”是内置命令,但仍然有一个命令行)。

因此,shell 将 HUGEVAR 扩展为一个大字符串,然后再次解析该字符串,以将其在空格上拆分为 echo 命令的各个参数列表。(请注意,这会将输入文件中的连续空白字符折叠为单个空格字符)。显然,对于大字符串,这个过程不是很有效。

您应该多次使用“cat bigfile”方法;并允许操作系统的文件系统缓存完成其工作并加速大文件的重复访问;当您使用 echo 时,您可以避免 shell 对字符串进行微妙的(可能不需要的)修改(加上“cat”方法将适用于二进制文件,其中 shell 方法可能会破坏二进制数据)。