0

我需要执行一组这样的命令:

system("command1; command2; command3")

如果我像上面那样做而不是做,在速度或任何其他指标方面是否有任何优势

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

2 回答 2

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
于 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 回答