2014-11-04 66 views
2

兩個腳本:擊VS的Perl/Python的:操作系統調用perfomace

的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; 

我在單核獲得相當顯著(約10% )CPU利用率差異。有什麼想法嗎?

這是我試圖解決的問題:我們有一些以Bash編寫的遺留腳本,每隔X秒運行一次。經過檢查,我們注意到他們消耗了大量的資源。將這些腳本重寫爲Perl/Python後,CPU利用率顯着下降。

Bash腳本大量使用調用外部程序(awk,cut,grep,sed等),而Perl/Python腳本是自包含的。我將其歸因於Bash在需要創建外部呼叫時會分叉/執行的事實,因此我們花費時間創建了數千個流程。

+0

你是如何運行這個bash腳本的? 'system'運行'bash'還是'sh'? – 2014-11-04 03:55:58

+0

兩者都在運行'bash'。 – 2014-11-04 03:59:19

+5

'system'的文檔似乎表明它使用'/ bin/sh -c'來執行。這不是'bash'(至少不是在正常的bash模式下,會使用不同的初始化文件等)。但是對於真正的問題是,看起來很可能是一個嚴重依賴外部程序的shell腳本比使用內置功能的自定義編寫的perl腳本運行速度慢。 – 2014-11-04 04:02:43

回答

1

對於例如,Perl的CPU利用率是更小,因爲它僅循環並調用一個殼(運行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,殺死10後的bash/perl的過程在同一系統上與pkill秒睡眠):

  • Perl的版本以上:6190
  • 您的bash版本:6146
  • 子shell bash的版本:4267
  • 猛砸與sh -c:2584
  • 你的Perl版本:2389

所以:Perl是輕微(如果有的話顯著)更快, CPU使用率稍低(大約一半),但這可能是由於解析器比bash更好。