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

时间:2010-04-24 09:31:36

标签: perl shell performance benchmarking

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

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

6 个答案:

答案 0 :(得分:7)

有很多方法可以让你的shell(例如Bash)执行得更快。

  1. 如果Bash的内部可以执行任务,请尝试使用较少的外部命令 为了你。例如,过度使用sedgrepawk等字符串/文字 操纵。
  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。这是this solution的有趣基准。
  4. 文件中有大约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超出他们作为一个衬里所能做的事情。

答案 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程序以使用可执行文件,在这种情况下,它可能会再次更快。