我需要執行這樣的一組命令的:殼執行許多命令
system("command1; command2; command3")
是否有任何優點在速度方面或任何其它度量,如果我不喜歡它上面而不是做
system "command1"
system "command2"
system "command3"
我需要執行這樣的一組命令的:殼執行許多命令
system("command1; command2; command3")
是否有任何優點在速度方面或任何其它度量,如果我不喜歡它上面而不是做
system "command1"
system "command2"
system "command3"
很可能,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
「Ruby執行比shell腳本慢」你有沒有任何實際的證據?大多數Ruby運行一個簡單腳本的「緩慢」是在虛擬機啓動和需要階段,這個階段已經發生了。 –
@AndrewMarshall我加了一個基準 – sawa
不錯。雖然我懷疑這真的是Ruby的速度緩慢,更多的是產生三個shell進程而不是一個進程的開銷。 –
除了@澤的答案有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
你爲什麼不基準,並找出? –
你確定*這些shell命令需要一個'system'調用嗎?找到一些本地Ruby無法做到的事情是非常不尋常的 - 特別是三件事情 - 一旦速度對你很重要,你當然應該考慮這一點。你會考慮與我們分享這些命令是什麼? – Borodin
我正在使用'mysqldump'創建一個mysql備份。我需要轉儲幾個表,使用'where'選項。 – akonsu