0

次のような一連のコマンドを実行する必要があります。

system("command1; command2; command3")

代わりに上記のようにすると、速度やその他のメトリックの点で利点がありますか

system "command1"
system "command2"
system "command3"
4

2 に答える 2

2

おそらく、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
于 2013-07-28T04:55:31.760 に答える
1

@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
于 2013-07-28T12:34:00.310 に答える