两个脚本:
的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在需要创建外部调用时分叉/执行的事实,因此我们花费时间创建数千个进程。
答案 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进程:
sh -c
猛击:2584 所以:Perl稍微(如果有意义)更快,CPU使用率稍低(大约一半),但这可能是由于解析器比bash更好。