python - Bash 与 Perl/Python : OS call perfomace

标签 python bash perl unix

两个脚本:

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/

相关文章:

linux - Shell 脚本无法识别 heredoc 分隔符

linux - awk 没有按预期工作

perl - 如何在我的 Perl TCP 脚本中诊断 "Cannot determine peer address"?

perl - 刷新行阅读运算符 Perl

python - 尝试使用谷歌云文本到语音 API 时无效的 JWT

python - 为什么我在解析时收到此错误?

python - 使用 scipy.optimise.minimise() 执行同时拟合/最小化

linux - Unix (ksh) 脚本,用于读取文件、解析和仅输出某些列

python - 无法从 VS2015 将 Django 项目发布到 Azure Web App

Perl 中 GPA 的正则表达式