2013-07-28 185 views
0

我需要執行這樣的一組命令的:殼執行許多命令

system("command1; command2; command3") 

是否有任何優點在速度方面或任何其它度量,如果我不喜歡它上面而不是做

system "command1" 
system "command2" 
system "command3" 
+2

你爲什麼不基準,並找出? –

+0

你確定*這些shell命令需要一個'system'調用嗎?找到一些本地Ruby無法做到的事情是非常不尋常的 - 特別是三件事情 - 一旦速度對你很重要,你當然應該考慮這一點。你會考慮與我們分享這些命令是什麼? – Borodin

+0

我正在使用'mysqldump'創建一個mysql備份。我需要轉儲幾個表,使用'where'選項。 – akonsu

回答

2

很可能,Ruby的執行速度比shell腳本慢,所以在shell中將序列擴展爲三個命令比在Ruby中執行要快。

但速度差別可能很小。更重要的是,這三個命令中的每一個在Ruby代碼中是否都具有邏輯意義。如果要將它們視爲一個在Ruby代碼中的邏輯級別中永遠不會分開的塊,那麼將它們連接到shell中更有意義。如果每個命令都與Ruby代碼中的某個邏輯概念相對應,那麼分離它們就更有意義。

基準

t = Time.now 
100.times do 
    system("echo foo; ls; echo bar ") 
end 
t1 = Time.now - t 

t = Time.now 
100.times do 
    system("echo foo ") 
    system("ls ") 
    system("echo bar ") 
end 
t2 = Time.now - t 

puts "Together: #{t1}", "Separate: #{t2}" 

結果

Together: 0.673181442 
Separate: 1.177105366 
+0

「Ruby執行比shell腳本慢」你有沒有任何實際的證據?大多數Ruby運行一個簡單腳本的「緩慢」是在虛擬機啓動和需要階段,這個階段已經發生了。 –

+0

@AndrewMarshall我加了一個基準 – sawa

+0

不錯。雖然我懷疑這真的是Ruby的速度緩慢,更多的是產生三個shell進程而不是一個進程的開銷。 –

1

除了@澤的答案有spawn,不等待的過程中開始下一道工序之前結束。它的速度更快:

n = 100 
t = Time.now 
n.times do 
    system("echo foo; ls; echo bar ") 
end 
t1 = Time.now - t 

t = Time.now 
n.times do 
    system("echo foo ") 
    system("ls ") 
    system("echo bar ") 
end 
t2 = Time.now - t 

t = Time.now 
n.times do 
    spawn("echo foo ") 
    spawn("ls ") 
    spawn("echo bar ") 
end 
t3 = Time.now - t 

t = Time.now 
n.times do 
    spawn("echo foo; ls; echo bar ") 
end 
t4 = Time.now - t 

puts "Together: #{t1}", "Separate: #{t2}", "Spawned: #{t3}",, "Spawned together: #{t4}" 

輸出:

Together: 0.242906748 
Separate: 0.379665418 
Spawned: 0.1551359 
Spawned together: 0.083032541