2010-06-16 7 views
6

Qual è l'impatto positivo sull'utilizzo di più metodi? Se ho 2 funzioni con lo stesso nome e lo stesso numero di argomenti che differiscono solo per il tipo (list vs. int), la mia performance subirà molto?Prestazioni multimodali

In altre parole, è preferibile denominare la funzione di aggiunta del vettore: "aggiungi-vettore" o lasciarlo come "aggiungi" o eventualmente "+"?

(Per semplicità ignoriamo i problemi che potrei avere ridefinendo funzioni integrate come "+").

+0

vorrei rispondere al posto del commento, ma in quanto non riguarda clojure in particolare, multimethods non dovrebbe incorrere in alcuna penalità aggiuntiva di ricerche normali. Cioè, una fase di implementazione è quella di manipolare nomi che li codificano con tipi di argomenti, e quindi non ci dovrebbero essere overhead. Tuttavia, la strategia di implementazione utilizzata da Clojure mi è sconosciuta, ma se utilizza il meccanismo sopra descritto, non ci sarà alcun overhead aggiuntivo. – jer

+0

Sì, dal momento che il clojure è un linguaggio dinamico, non penso che sarà lo stesso. Anche il clojure utilizza una funzione di invio che genera chiavi che vengono applicate a un elenco di funzioni disponibili. –

+0

Si potrebbe voler esaminare 'clojure.contrib.generic' e' clojure.contrib.generic. * '(' C.c.generic.arithmetic' sarà probabilmente più interessante per voi). –

risposta

9

Esiste un costo in termini di prestazioni nell'utilizzo di metodi multipli, ma se non è assolutamente necessario, è necessario continuare a utilizzarli se sono la migliore astrazione.

Detto questo, Clojure 1.2's protocols fornisce un'alternativa a velocità nativa ai multi-metodi per determinati casi d'uso, e sono particolarmente adatti a casi in cui si potrebbe aver utilizzato un metodo multi-metodo con un dispatch basato su tipo.

+0

Eccellente, penso che questo sia esattamente quello che sto cercando. I protocolli dovrebbero permettermi di "scavalcare" la funzione + per le mie classi vettoriali. –

1

Poiché Clojure può utilizzare funzioni di invio arbitrarie, il costo aggiuntivo di un multimetodo è il costo della funzione di spedizione + una ricerca di mappa.

O come cemerick metterlo:

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