2013-06-05 14 views

risposta

5

Credo compilatore Inlines alcune funzioni fondamentali come inc, soprattutto se applicata agli argomenti primitivi.

Quando si utilizza inc come una funzione regolare (ad esempio passando a funzioni di ordine superiore, aliasing con let ecc.), Le prestazioni potrebbero quindi essere peggiori perché perde la capacità di inline. Il sovraccarico extra deriva dal fare una chiamata di funzione in più, forse anche il costo di inscatolare uno o più argomenti.

Questa non è una limitazione di Clojure, riflette solo il fatto che il compilatore non è ancora molto sofisticato con le sue ottimizzazioni. Probabilmente puoi aspettarti che cose come questa migliorino molto nelle versioni future di Clojure.

+2

Questo è esattamente giusto. 'inc' è in linea, e infatti dato che' i' è noto per essere un primitivo lungo, il compilatore può effettivamente emettere una singola operazione bytecode per aggiungere 1, scavalcando interamente i metodi in 'clojure.lang.Numbers'. – amalloy

5

Solo per aggiungere a ciò che mikera ha menzionato inlining. inc è una variabile associata a una funzione. Se si guarda il meta di var inc i.e (meta #'inc) si troverà che ha una chiave :inliner il cui valore il compilatore può utilizzare per inline il codice della funzione in cui viene chiamato utilizzando var var. Quando si utilizza let per associarlo localmente, si sta vincolando l'oggetto funzione a un nuovo nome in ambito locale e l'oggetto funzione non ha alcuna informazione inlinea, era la variabile inc che ha quell'informazione e quindi il compilatore non può in linea .

Problemi correlati