2013-07-28 4 views
0

мне нужно выполнить набор команд, как это:оболочка выполняет ряд команд

system("command1; command2; command3") 

есть какие-либо преимущества с точки зрения скорости или любые другие показатели, если я делаю это, как и выше, вместо делать

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

Почему вы не бенчмарк это и выяснить? –

+0

Вы уверены, что этим командам оболочки нужен «системный» вызов? Необычно найти что-то, чего не может сделать собственный Ruby - особенно три вещи одновременно - и это, безусловно, то, что вы должны учитывать, если скорость важна для вас. Не могли бы вы поделиться с нами, что это за команды? – Borodin

+0

Я создаю резервную копию mysql, используя 'mysqldump'. Мне нужно сбросить несколько таблиц, используя опцию 'where'. – akonsu

ответ

2

Возможно, выполнение Ruby выполняется медленнее, чем сценарий оболочки, поэтому расширение последовательности на три команды внутри оболочки происходит быстрее, чем в Ruby.

Но разница в скорости, вероятно, мала. И самое главное, имеет ли каждая из трех команд логическое значение в коде Ruby. Если их считать одним куском, который никогда не отделен в пределах уровня логики в коде Ruby, тогда имеет смысл связывать их в оболочке. Если каждая команда соответствует некоторой логической концепции в коде Ruby, то имеет смысл разделить их.

Benchmark

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 медленнее, чем скрипт оболочки», есть ли у вас какие-либо фактические доказательства? Большая часть «медленности» Ruby для запуска тривиального скрипта находится в запуске VM и требует фазы, которая уже произошла в этот момент. –

+0

@AndrewMarshall Я добавил тест – sawa

+0

Nice. Хотя я сомневаюсь, что на самом деле Ruby работает медленно, и тем более накладные расходы на создание трех процессов оболочки вместо одного. –

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 
Смежные вопросы