2011-09-02 15 views
8

Lo que es más rápido en adelante invocación:¿Qué funciona más rápido en Ruby: definir el método de alias o usar alias_method?

def first_method?() second_method?() end 

o

alias_method :first method, :second_method 

y si es posible por qué?

(NOTA: No te pido lo que es más agradable mejor etc/-> sólo la velocidad prima y por qué es más rápido es interesante aquí)

+1

¿No es obvio que la primera versión tiene una búsqueda de método adicional que hacer? Rubinius simplifica algunos códigos, por lo que podría ser idéntico. –

Respuesta

7

un rápido vistazo al código fuente, le mostrará el truco:

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

alias_method está escrito en C. Por otra parte, la definición de un método en el rubí que llama a otro método, se traducirá en 2 Método búsquedas y llamadas.

por lo que, alias_method debería ser más rápido.

+0

+1 para ver la implementación;) – lucapette

+1

Sí, pero la implementación (en C) de 'alias_method' realmente no importa (a menos que malinterprete la pregunta). El punto es que aparentemente 'alias_method' simplemente crea otra entrada en la tabla de símbolos que hace referencia al objeto de función original. Y esto no se puede ver desde la fuente vinculada. –

+0

ese no es el punto principal. no solo crea una entrada en la tabla de símbolos, sino que dice que debe devolver el resultado del método de alias. esto es completamente diferente de definir (con ruby) un método que explícitamente llama a otro. –

13

Al menos en Ruby 1.8.6, aliasing parece ser más rápido :

#!/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 

resultados en:

$ ./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) 

Obviamente, hay una llamada método menos (receptor look-up ...). Entonces parece natural que sea más rápido.

+1

He hecho un punto de referencia similar y parece confirmar lo que dices. Es justo decir que el aliasing sería un poco más rápido ... – lucapette

+1

solo quiere agregar que el rendimiento de 'alias' es similar a' alias_method' – lulalala

Cuestiones relacionadas