Что работает быстрее в Ruby: определение метода псевдонима или использование alias_method? - PullRequest
8 голосов
/ 02 сентября 2011

Что быстрее при последующем вызове:

def first_method?() second_method?() end

или

alias_method :first method, :second_method

и, если возможно, почему?

(ПРИМЕЧАНИЕ: я не спрашиваю, чтолучше / лучше и т. д. -> интересна только грубая скорость и почему она быстрее)

Ответы [ 2 ]

13 голосов
/ 02 сентября 2011

По крайней мере, в 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)

Очевидно, что у вас на один вызов метода меньше (поискполучатель ...).Поэтому кажется естественным, что это будет быстрее.

7 голосов
/ 02 сентября 2011

быстрый взгляд на исходный код покажет вам хитрость:

http://www.ruby -doc.org / core / classes / Module.src / M000447.html

alias_method написан на C. более того, определение метода в ruby, который вызывает другой метод, приведет к 2 поискам и вызовам методов.

, поэтому alias_method должен быть быстрее.

...