我在Perl和shell中编写了多个脚本,并且比较了实际的执行时间。在所有情况下,Perl脚本比shell脚本快10倍以上。
所以我想知道是否有可能编写一个比Perl中的同一个脚本更快的shell脚本?为什么Perl比shell更快,尽管我在Perl脚本中使用system函数?
答案 0 :(得分:7)
有很多方法可以让你的shell(例如Bash)执行得更快。
sed
,grep
,awk
等字符串/文字
操纵。command|grep|grep|cut|sed
会使您的代码变慢。每根管子都是架空的。
对于这个例子,只有一个awk可以完成它们。
command | awk '{do everything here}'
您可以使用的最接近的工具,它可以匹配Perl的某些任务的速度,例如字符串操作或数学,是awk。这是this solution的有趣基准。 输出
$ 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超出他们作为一个衬里所能做的事情。
答案 1 :(得分:4)
这可能会非常接近扶手椅优化,但这里有一些想法可能会使你的结果合理化:
Fork / exec:shell脚本完成的任何有用的东西都是通过shell-out完成的,即启动一个新shell并运行一个命令,如sed
,{{1 },awk
等。更常见的是,执行多个进程,并通过管道移动数据。
数据结构:Perl的数据结构比Bash或Csh更复杂。这通常会强制程序员使用数据存储创建。这可以采取以下形式:
非优化实现:某些shell构造可能在设计时没有考虑优化,但用户方便。例如,我有理由相信参数扩展特别是cat
的bash实现相对于${foo//search/replace}
中的相同操作是次优的。对于日常任务而言,这通常不是问题。
答案 2 :(得分:2)
好吧,我知道我是在两年前开放一堆蠕虫来要求它,但我对任何答案都不是100%满意。
正确的答案是肯定的。但是大多数新编码员仍会使用Perl和Python编写代码,因为他们缺乏了解何时使用哪些工具所需的指导或经验,所以编写的代码很难与外部执行者打交道。
Korn Shell(ksh)拥有快速内置的数学运算,以及一个功能齐全且速度快的正则表达式引擎,可以处理Perl类型的正则表达式。它还有关联数组。它甚至可以加载外部.so库。它是10年前成品和成熟的产品。它甚至已经安装在你的Mac上了。
答案 3 :(得分:1)
不,我认为这是不可能的:
bash命令是真正的交错语言,但Perl程序在执行之前被编译为字节码
答案 4 :(得分:1)
在某些情况下,某些shell命令可以比Perl运行得更快。我曾经用perl对一个简单的sed脚本进行基准测试,并且sed获胜了。但是当需求变得更加复杂时,perl版本开始击败sed版本。所以答案是,这取决于。但是出于其他原因,(简单性,可维护性等)我总是倾向于在Perl中做事,除非要求非常简单,我希望它们保持这种状态。
答案 5 :(得分:-2)
是。对于同样的事情,C代码将比Perl代码更快,因此使用已编译的可执行文件执行大量工作的脚本将比执行相同操作的perl程序更快。
当然,可以重写Perl程序以使用可执行文件,在这种情况下,它可能会再次更快。