是否有可能编写一个比Perl中的等效脚本更快的shell脚本?

Joh*_*nGa 7 shell perl performance benchmarking

我在Perl和shell中编写了多个脚本,并且比较了实际的执行时间.在所有情况下,Perl脚本比shell脚本快10倍以上.

所以我想知道是否有可能编写一个比Perl中的同一个脚本更快的shell脚本?为什么Perl比shell更快,尽管我在Perl脚本中使用系统函数?

gho*_*g74 7

有几种方法可以让你的shell(例如Bash)执行得更快.

  1. 如果Bash的内部可以为您完成任务,请尝试使用较少的外部命令.例如,过度使用sed,grep,awk等字符串/文本操作.
  2. 如果您正在操作相对较大的文件,请不要在读取循环时使用bash.使用awk.如果您正在操作真正的BIG文件,可以使用grep搜索所需的模式,然后将它们传递给awk以"编辑".grep的搜索算法非常好而且快速.如果您只想获得文件的前端或末尾,请使用head和tail.
  3. 文件操作工具,如sed,cut,grep,wc等都可以使用一个awk脚本或使用Bash内部,如果不复杂的话.因此,您可以尝试减少这些功能重叠的工具的使用.Unix管道/链接非常好,但是使用它们太多了,例如 command|grep|grep|cut|sed 使代码变慢.每根管子都是架空的.对于这个例子,只有一个awk可以完成它们. command | awk '{do everything here}' 您可以使用的最接近的工具,它可以匹配Perl的某些任务的速度,例如字符串操作或数学,是awk.这是此解决方案的有趣基准.文件中有大约900万个数字

产量

$ head -5 file
1
2
3
34
42
$ wc -l <file
8999987

# time perl -nle '$sum += $_ } END { print $sum' file
290980117

real    0m13.532s
user    0m11.454s
sys     0m0.624s

$ time awk '{ sum += $1 } END { print sum }' file
290980117

real    0m9.271s
user    0m7.754s
sys     0m0.415s

$ time perl -nle '$sum += $_ } END { print $sum' file
290980117

real    0m13.158s
user    0m11.537s
sys     0m0.586s

$ time awk '{ sum += $1 } END { print sum }' file
290980117

real    0m9.028s
user    0m7.627s
sys     0m0.414s
Run Code Online (Sandbox Code Playgroud)

对于每次尝试,awk都比Perl快.

最后,尝试学习awk超出他们作为一个衬里所能做的事情.