我在Perl和
shell中编写了多个脚本,并且比较了实际的执行时间.在所有情况下,Perl脚本比shell脚本快10倍以上.
所以我想知道是否有可能编写一个比Perl中的同一个脚本更快的shell脚本?虽然我在Perl脚本中使用system函数,为什么Perl比shell更快?
解决方法
有几种方法可以让你的shell(例如Bash)执行得更快.
>如果Bash的内部可以执行任务,请尝试使用较少的外部命令
为了你.例如,对字符串/文本过度使用sed,grep,awk等
操纵.
>如果您正在操作相对较大的文件,请不要在读取循环时使用bash.
使用awk.如果您正在操作真正的BIG文件,可以使用grep搜索所需的模式,然后将它们传递给awk以“编辑”. grep的搜索算法非常好而且快速.如果您只想获得文件的前端或末尾,请使用head和tail.
>文件操作工具,如sed,cut,wc等都可以完成
使用一个awk脚本或使用Bash内部,如果不复杂.因此,您可以尝试减少这些功能重叠的工具的使用.
Unix管道/链接非常好,但使用了太多,
例如
命令| grep | grep | cut | sed使你的代码变慢.每根管子都是架空的.
对于这个例子,只有一个awk可以完成它们.
命令| awk'{在这里做一切}’
您可以使用的最接近的工具,它可以匹配Perl的某些任务的速度,例如字符串操作或数学,是awk.这是this solution的有趣基准.文件中有大约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
对于每次尝试,awk都比Perl快.
最后,尝试学习awk超出他们作为一个衬里所能做的事情.