2012-02-15 4 views
2

В конструкторе часто бывает, что вы хотите превратить аргументы в переменные экземпляра. Наивный способ сделать это:Эффективно ли использовать конструктор splat в конструкторе?

class A 
    def initialize a, b, c 
     @a, @b, @c = a, b, c 
    end 
end 

но простой способ:

class A 
    def initialize *args 
     @a, @b, @c = args 
    end 
end 

Но я был обеспокоен скоростью кода, поскольку он выглядит как последний код создает дополнительный массив args, который не был создан в прежнем коде. С точки зрения скорости или эффективности, лучше придерживаться первого, а не использовать последний, или нет никакой разницы?

+0

Рубин достаточно медленно, что дополнительный массив не имеет значения слишком много. * утки * –

+0

не совсем ответ, но я бы предложил написать тестовую программу, которая создает тысячи объектов, используя каждое определение конструктора. сравнение времени для каждого завершения приведет к более быстрой реализации двух реализаций. – ardnew

+0

Я знаю, что вы особенно обеспокоены скоростью, но, учитывая, что второй фрагмент отбрасывает важную информацию (аргументы метода), трудно понять, почему бы написать ее таким образом ... – tokland

ответ

4

Выглядит хорошо здесь:

RUBY_VERSION # => "1.9.3" 

def set_each(a,b,c) 
    a2, b2, c2 = a, b, c 
end 

def set_ary(*args) 
    a2, b2, c2 = args 
end 

def time(n) 
    start_time = Time.now 
    n.times { yield } 
    Time.now - start_time 
end 

n = 1_000_000 
time(n) { set_each 1, 2, 3 } # => 0.301268 
time(n) { set_ary 1, 2, 3 } # => 0.308298 
+0

Я вижу. Так что это немного медленнее. – sawa

Смежные вопросы