次のような一連のコマンドを実行する必要があります。
system("command1; command2; command3")
代わりに上記のようにすると、速度やその他のメトリックの点で利点がありますか
system "command1"
system "command2"
system "command3"
次のような一連のコマンドを実行する必要があります。
system("command1; command2; command3")
代わりに上記のようにすると、速度やその他のメトリックの点で利点がありますか
system "command1"
system "command2"
system "command3"
おそらく、Ruby の実行はシェル スクリプトよりも遅いため、シェル内でシーケンスを 3 つのコマンドに展開する方が、Ruby で実行するよりも高速です。
しかし、速度差はおそらく小さいです。さらに重要なのは、3 つのコマンドのそれぞれが Ruby コード内で論理的な意味を持つかどうかです。Ruby コードのロジックのレベル内で決して分離されない 1 つのチャンクと見なされる場合は、シェルでそれらを接続する方が理にかなっています。各コマンドが 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
@sawa の回答に加えて、次のプロセスを開始する前にプロセスが終了するのを待たない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