Что работает быстрее в Ruby: определение метода alias или использование метода alias?
что быстрее при более позднем вызове:
def first_method?() second_method?() end
или
alias_method :first method, :second_method
и если можно почему?
(примечание: Я не спрашиваю, что лучше / лучше и т. д. - >здесь интересна только сырая скорость и почему она быстрее)
2 ответов
быстрый взгляд на исходный код, покажу вам трюк:
http://www.ruby-doc.org/core/classes/Module.src/M000447.html
alias_method записывается в C. Кроме того, определение метода в ruby, который вызывает другой метод, приведет к поиску и вызовам 2 методов.
Итак, alias_method должен быть быстрее.
по крайней мере, в Ruby 1.8.6, сглаживание кажется быстрее:
#!/usr/local/bin/ruby
require 'benchmark'
$global_bool = true
class Object
def first_method?
$global_bool
end
def second_method?
first_method?
end
alias_method :third_method?, :first_method?
end
Benchmark.bm(7) do |x|
x.report("first:") { 1000000.times { first_method? }}
x.report("second:") { 1000000.times { second_method? }}
x.report("third:") { 1000000.times { third_method? }}
end
результаты :
$ ./test.rb
user system total real
first: 0.281000 0.000000 0.281000 ( 0.282000)
second: 0.469000 0.000000 0.469000 ( 0.468000)
third: 0.281000 0.000000 0.281000 ( 0.282000)
очевидно, у вас есть один вызов метода меньше (look-up receiver ...). Поэтому кажется естественным, чтобы он был быстрее.