2010-08-21 18 views
6

Ci sono alcune funzioni di libreria comuni in erlang che sono molto più lente del loro equivalente c.Erlang - C ed Erlang

È possibile avere codice c eseguire l'analisi binaria e il numero di crunch e avere processi di spawn di erlang per eseguire il codice c?

+1

una degna modifica della domanda: P – Drew

+1

@Drew Molto più organizzato e conciso in questi giorni. Guadagnare un grado di ingegneria astronomica aiuta sicuramente. – BAR

risposta

4

Naturalmente C sarebbe più veloce, nel caso estremo, dopo ottimizzazioni. Se più velocemente intendi correre più veloce.

Erlang sarebbe di gran lunga, più veloce da scrivere. A seconda dei requisiti di velocità che hai Erlang è probabilmente "abbastanza veloce", e ti farà risparmiare giorni di ricerca di errori in C.

Il codice C sarà più veloce solo dopo le ottimizzazioni. Se trascorri la stessa quantità di tempo su C ed Erlang, ne uscirai all'incirca alla stessa velocità (nota che conto il tempo speso per il debugging e il fixing degli errori in questa stima temporale, che sarà molto meno in Erlang).

Quindi:

faster writing = Erlang 
faster running (after optimisations) = C 
faster running without optimisations = any of the two 

fare la vostra scelta.

+1

luna: Penso che tu abbia un'immagine eccessivamente ottimista di erlang. Erlang è interpretato e funziona molto più lentamente di C. È più facile usare più core, e quindi si adatta meglio di un programma ingenuamente scritto in c. Tuttavia, per lo scricchiolio di numeri di base, basta far girare X thread in C e potrai correre più veloce di Erlang ogni giorno. Ottimizzato o no. Per i numeri: http://shootout.alioth.debian.org/u64/benchmark.php?test=all&lang=hipe&lang2=gcc – Toad

+0

Come ho detto. Spendi la stessa quantità di tempo per lo sviluppatore sull'attività. Includere il tempo di debug in questo e credo che Erlang farebbe piuttosto bene. Non perché Erlang sia veloce (non lo è), ma perché C è lento a scrivere e fare il debug. Soprattutto se si utilizzano discussioni e concorrenza. –

+0

Non sarei sorpreso se hai ragione però ... –

1

Prima di tutto scrivere tutta la logica del sistema in Erlang, quindi implementare i binari di gestione in C. L'uso dei NIF (è una specie di interfaccia per C) è piuttosto semplice e trasparente per il resto del sistema. Ecco un'altra discussione su come parlare con C Run C Code Block in Erlang.

Prima di hackerare C, assicurati di aver eseguito il benchmark dell'attuale implementazione. È possibile che soddisfi le vostre esigenze, specialmente con l'ultima versione di Erlang/OTP (R14) che introduce grandi miglioramenti nella gestione binaria.

1

la filettatura semplice non è così interessante da erlang. Facile threading + Il passaggio dei messaggi e il framework OTP è ciò che è fantastico su erlang. Se hai bisogno di crunch di numeri usa qualcosa come ocaml, python, haskell. Erlang è bravissimo nel gestire i numeri.

I binari di analisi sono una delle cose che l'erlang è il meglio, anche se probabilmente il migliore. L'erlang di programmazione del libro di Joe copre tutto molto bene, e non è così costoso usato. Parla anche di integrazione del codice C e fornisce un esempio. la fonte è disponibile da una programmazione pragmatica senza dover acquistare il libro, è possibile includere #include o qualcosa del genere.

+1

"Erlang è bravissimo nel gestire i numeri". - Immagino tu intenda "non è"? –

0

Se ti piace Erlang, ma vuoi la velocità C, perché non andare per JOCAML. È un'estensione per OCAML (che è simile a Erlang ma è vicino a C in termini di velocità) progettato per la rivoluzione multicore in corso al momento. Lo adoro (e conosco più di 10 linguaggi di programmazione ...)

3

Ci sono due regole approssimativa basato su Erlang FAQ:

  1. codice che coinvolge principalmente calcoli complessi ed elaborazione dei dati verrà eseguito circa 10 volte più lento di un programma C equivalente. Questo include quasi tutti i "micro benchmark".

  2. Grandi sistemi che passavano la maggior parte del loro tempo a comunicare con altri sistemi, a riprendersi dagli errori ea prendere decisioni complesse che correvano almeno alla stessa velocità dei programmi C equivalenti.

Tuttavia ci sono alcune soluzioni ufficiali alla mancanza di macinare numeri prestazione di Erlang:

Implementare una funzione in C e caricamento sua codice oggetto nella macchina virtuale Erlang per essere come una normale funzione di Erlang ma con prestazioni native.

Esempi: Evedis, Bitcask, ElevelDB

Un'interfaccia byte orientato da Erlang macchina virtuale processi OS esterni attraverso descrittori file di input e di output standard. La comunicazione con questa porta passa attraverso il messaggio che passa dal punto di vista di Erlang.

Un file oggetto C collegata dinamicamente che viene caricato nella macchina virtuale Erlang e si comporta come una porta. La comunicazione con questo driver della porta passa attraverso il messaggio che passa dal punto di vista di Erlang.

Esempi: OTP_Inet, ENanomsg, P1_TLS

si può semplicemente promuovere il tuo runtime Erlang ad un nodo distribuito. In questo modo c'è una specifica per implementare un runtime Erlang in C e comunicare con i nodi di Erlang con una singola interfaccia.

Tutte le soluzioni di cui sopra hanno i suoi pro e contro e devono essere utilizzate con estrema cura.

+0

Questa è di gran lunga la migliore risposta. Il resto delle risposte sono un mambo jumbo sulle prestazioni e ... perché? Buon lavoro signore. –

-2

Ho usato C per oltre 20 anni. Sto usando Erlang quasi esclusivamente negli ultimi anni. C è più veloce da eseguire per ovvi motivi. Hower, Erlang è abbastanza veloce per la maggior parte delle cose quando lo fai bene. Inoltre, scrivere Erlang è molto più veloce e divertente.

Per il pezzo di algoritmi per cui la velocità di runtime è critica, sicuramente può essere scritta in C, che è il modo di Erlang BIF.

0

Sì,

Ma c'è più di un modo per questo, in senso lato, alcuni o tutti dei quali sono già elencato.

Dovremmo chiederci:

  • sono le procedure davvero equivalenti (come si fa il Erlang e C differiscono)?
  • C'è un modo migliore per scrivere Erlang per questa attività (altre procedure/librerie o tipi di dati)?

Potrebbe essere utile prendere in considerazione questo post: Scaling & Speed with Erlang.