两个脚本:
Perl
use strict;
use warnings;
use utf8;
while (1) {
my $cmd = "echo bla | grep bla";
system($cmd);
}
bash
while true;
do echo bla | grep bla;
done;
我在 CPU 利用率方面有相当大的差异(单核大约 10%)。有什么想法吗?
这就是我要解决的问题:我们有一些用 Bash 编写的遗留脚本,每 X 秒运行一次。经过检查,我们注意到它们消耗了大量资源。在将这些脚本重写为 Perl/Python 后,CPU 利用率显着下降。
Bash 脚本大量使用调用外部程序(awk、cut、grep、sed 等),而 Perl/Python 脚本是独立的。我将其归因于 Bash 在需要创建外部调用时 fork /执行,因此我们花费时间创建数千个进程。
最佳答案
例如,Perl CPU 利用率较低,因为它只循环并调用一个 shell(运行 system
)
bash 脚本执行循环和回显。
更公平的比较将使用以下 shell 脚本:(强制使用子 shell 进行回显)
while true; do
( echo bla | grep bla; )
done;
甚至:(避免简单地 fork )
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
- 子外壳 bash 版本:4267
- 使用
sh -c
进行 Bash:2584 - 你的 Perl 版本:2389
所以:Perl 稍快(如果有的话)更快,CPU 使用率稍微低一些(大约一半),但这可能是由于比 bash 更好的解析器。
关于python - Bash 与 Perl/Python : OS call perfomace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26727420/