2010-06-16 10 views
6

¿Cuál es el impacto en el rendimiento del uso de métodos múltiples? Si tengo 2 funciones con el mismo nombre y la misma cantidad de argumentos que difieren solo por el tipo (lista vs. int), ¿mi rendimiento va a sufrir mucho?Rendimiento de multimétodos

En otras palabras, es mejor nombrar mi función de adición de vectores: "add-vector" o dejarlo como "agregar" o posiblemente "+"?

(En aras de la simplicidad, ignoremos los problemas que pueda tener al redefinir funciones incorporadas como "+").

+0

me contestarían en lugar del comentario, pero ya que no se refiere a clojure en concreto, métodos múltiples no debe incurrir en ninguna penalización adicional de las búsquedas normales. Es decir, una de las estrategias de implementación es modificar los nombres que los codifican con tipos de argumentos, y luego no debería haber gastos generales. Sin embargo, la estrategia de implementación que utiliza Clojure es desconocida para mí, pero si utiliza el mecanismo anterior, no habrá gastos adicionales. – jer

+0

Sí, dado que clojure es un lenguaje dinámico, no creo que sea lo mismo. Además, clojure utiliza una función de despacho que genera claves que se aplican a una lista de funciones disponibles. –

+0

Es posible que desee examinar 'clojure.contrib.generic' y' clojure.contrib.generic. * '(' C.c.generic.arithmetic' será lo más interesante para usted). –

Respuesta

9

El uso de métodos múltiples tiene un costo de rendimiento, pero a menos que sea absolutamente necesario, debe continuar usándolos si son la mejor abstracción.

Dicho esto, Clojure 1.2's protocols proporciona una alternativa de velocidad nativa a los métodos múltiples para ciertos casos de uso, y es particularmente adecuada para los casos en los que anteriormente se podría haber usado un método múltiple con un despacho basado en tipo.

+0

Excelente, creo que esto es exactamente lo que estoy buscando. Los protocolos deberían permitirme "anular" la función + para mis clases de vectores. –

1

Dado que Clojure puede usar funciones de despacho arbitrarias, el costo adicional de un multimétodo es el costo de la función de despacho + una búsqueda en el mapa.

O como cemerick puso:

(defmulti can-your-dispatch-do-that? 
    (fn [& _] 
    (if (= (phase-of-moon) :full) 
     :do-this 
     :do-that)))