2010-02-02 14 views
34

Modifica:I parametri di riferimento Clojure sono aggiornati allo the Benchmarks Game.Ci sono dei buoni benchmark Clojure?

Ho fatto questa domanda wiki della comunità e invito altri a tenerlo aggiornato.


Qualcuno è a conoscenza dei parametri di riferimento delle prestazioni di Clojure?

Ho fatto un po 'di mio (anche se non troppo formale) e non era giusto in confronto ad altri linguaggi funzionali (provato Haskell e OCaml). Ma come appare rispetto a Java o ad un'altra lingua sulla JVM (ad esempio Scala)? E come si confronta con altri Lisps?

C'era dello discussion sul forum Computer Language Benchmarks Game sull'aggiunta di Clojure lì, ma non è stato ancora fatto nulla.

Edit: ho intenzione di continuare ad aggiungere a questo come trovo più:

@igouy ha sottolineato che gli script di riferimento per clojure are being created di jafingerhut su github.

Due le discussioni molto importanti dal gruppo di discussione Clojure:

E a parte, questi post del blog:

E, infine, una questione connessa su StackOverflow:

La maggior parte di queste discussioni mi portano a pensare che la performance di Clojure è molto favorevole rispetto ad altre lingue in esecuzione sulla JVM, anche se non c'è dubbio che può essere molto difficile giungere ad una vasta conclusione quando si confrontano le lingue perché le loro prestazioni possono variare notevolmente in base all'attività.

Edit:

Lau Jensen appena pubblicato una grande discussione su analisi comparativa con le lingue JVM sul suo blog: "Getting benchmarking right".

+0

>> molto difficile arrivare a una conclusione generale << Quindi prova per una conclusione ristretta. – igouy

+0

Questo è vero e apprezzo quanto possa essere difficile, ma d'altra parte non è del tutto pratico sapere che il clojure è il migliore per i problemi di tipo x, mentre "nominare l'altra lingua" è il migliore per i problemi di tipo y , eccetera.; ad un certo punto, hai bisogno di un'euristica per scegliere una lingua basata sulla sua performance "complessiva", e "a parità di tutti gli altri" ho bisogno di decidere se il clojure merita l'investimento. – Shane

+0

>> in base alla sua prestazione "complessiva" e "a parità di tutti gli altri" << Anche quando sembra che la performance "complessiva" sia una finzione? – igouy

risposta

8

Questa è una domanda importante che quasi tutti pensano prima di considerare il clojure. È anche una domanda difficile anche per i linguaggi maturi che non aggiungono cose, come le sequenze troncate, che modificano radicalmente le prestazioni di alcuni compiti specifici (sebbene comuni). Ho trovato dei bei pensieri in this thread. Molti dei benchmark che trovi saranno correlati alle versioni precedenti di java e clojure, quindi è improbabile che qualcuno possa trovare "benchmark davvero buoni".

La grande domanda da porsi qui è Java è abbastanza veloce. Questa è una precondizione per celare l'essere abbastanza veloce. Se riesci a convincerti che la risposta a questa domanda è sì, allora è sicuro procedere in Clojure e implementare le parti che il tuo profilo identifica come colli di bottiglia in Java. Perché hai una lingua di failback con prestazioni ben note In Clojure generalmente andrai sicuro.

2

Potreste anche essere interessati alla serie concur.next di Tim Bray. Discute alcuni problemi di prestazioni.

1

Clojure non sarà mai in grado di eguagliare un programma Scala che sfrutta appieno la mutabilità in un algoritmo che ne trae beneficio. C'è anche il fatto che Clojure è un linguaggio dinamico, che, al momento, non è molto ben supportato da JVM.

D'altro canto, Clojure eccelle nell'abilitare algoritmi paralleli, asincroni e distribuiti e algoritmi immutabili in generale.

Quindi, se si desidera (principalmente) l'immutabilità e l'efficienza multicore, Clojure renderà questi molto più facili da raggiungere. Se i tuoi algoritmi realmente, hanno davvero bisogno di usare pesantemente la mutabilità per efficienza, allora Scala li renderà più facili.

Qualsiasi cosa nel mezzo, probabilmente non importa in alcun modo.

+4

clojure può funzionare con gli array java o con la raccolta java ed è possibile utilizzare i suggerimenti sul tipo in modo forse difficile, ma è possibile se ne avete VERAMENTE bisogno. – nickik

8

Per questioni di performance si rimanda al seguente blogpost:

http://meshy.org/2009/12/13/widefinder-2-with-clojure.html

Questo dimostra un'implementazione Clojure della sfida WideFinder2 che è più veloce sia Java, Scala e thread singolo C. Compara con tempi ufficiali.

Per quanto riguarda Daniels osserva che Clojure non sarà mai più veloce, vediamo che è ovviamente errato in base ai risultati sopra. La mutabilità è più veloce dell'immutabilità, che è l'impostazione predefinita di Clojures, tuttavia Clojure consente transitori locali (cioè dati mutabili temporaneamente), in modo che si possa raggiungere la velocità ottimale.

Fare riferimento a clj-me.cgrand.net per molte tecniche di ottimizzazione.

In conclusione: Clojure può essere veloce come vorresti mentre ti consente comunque di mantenere un semplice ed elegante base di codici, quasi una combinazione unica.

+4

Questa è una lettura interessante! Non sono sicuro che la conclusione che "Clojure può essere veloce come vorresti che fosse" vale da quel punto di riferimento. L'autore ha fatto un sacco di ottimizzazione del codice Clojure e ammette che gli stessi trucchi avrebbero funzionato per Java e Scala (ad esempio molto evitava Java's String.split!). Parla più delle virtù dell'ottimizzazione ripetuta. Dimostra che si può essere perfettamente a proprio agio nell'usare Clojure per una vasta gamma di compiti. –

Problemi correlati