Bash vs Perl / Python:操作系统调用性能

时间:2014-11-04 03:49:39

标签: python bash perl unix

两个脚本:

的Perl

use strict;
use warnings;
use utf8;

while (1) {
   my $cmd = "echo bla | grep bla";
   system($cmd);
}

while true;
do echo bla | grep bla;
done;

我的CPU利用率相当显着(单核上大约10%)差异。有什么想法吗?

以下是我要解决的问题:我们有一些用Bash编写的遗留脚本,每隔X秒运行一次。经过检查,我们注意到他们消耗了大量的资源。在将这些脚本重写为Perl / Python后,CPU利用率显着下降。

Bash脚本大量使用调用外部程序(awk,cut,grep,sed等),而Perl / Python脚本是自包含的。我将它归结为Bash在需要创建外部调用时分叉/执行的事实,因此我们花费时间创建数千个进程。

1 个答案:

答案 0 :(得分:1)

对于该示例,Perl CPU利用率较低,因为它仅循环并调用shell(以运行system

bash脚本同时执行循环和回显。

更公平的比较将使用以下shell脚本:(强制回显的子shell)

while true; do 
  ( echo bla | grep bla; )
done;

甚至:(以防止它简单地分叉)

while true; do 
  sh -c 'echo bla | grep bla'
done;

在这种情况下,我希望Perl表现更好(CPU使用率更低),因为它使用a partial optimizing "compiler"。例如,主进程主要花费时间等待子进程返回。

使用当前版本,较高的bash使用率可部分归因于bash脚本执行更多操作(echo是内置命令,Perl使用整个命令启动shell,而后者又运行echo和启动一个grep进程) - Perl进程的CPU使用率较低,但整体使用情况可能更多。

更相同的Perl脚本是:

use strict;
use warnings;
use utf8;

while (1) {
   open(CMD,"|-","grep","bla");
   print CMD "bla\n";
   close(CMD);
}

当然,比较性能可能也很重要:

10秒迭代(用wc -l计算,在同一系统上用pkill进行10秒睡眠后杀死bash / perl进程:

  • 上面的Perl版本:6190
  • 您的bash版本:6146
  • Subshel​​l bash版本:4267
  • 使用sh -c猛击:2584
  • 您的Perl版本:2389

所以:Perl稍微(如果有意义)更快,CPU使用率稍低(大约一半),但这可能是由于解析器比bash更好。