2012-04-22 25 views
45

La lingua di Julia compila lo script ogni volta, non è possibile compilare i binari con julia? Ho provato un piccolo script helloworld con la funzione println ci sono voluti 2,3 secondi perché Julia mostrasse l'output! Sarebbe meglio se possiamo creare binari invece di compilarli ogni voltaJulia compila la sceneggiatura ogni volta?

Aggiornamento: Ci sono stati alcuni cambiamenti in Julia, dal momento che ho fatto questa domanda. Anche se non seguo più gli aggiornamenti per Julia, dal momento che ho posto questa domanda e se stai cercando qualcosa di simile, guarda nelle risposte e nei commenti che seguono le persone che stanno seguendo Julia.

Inoltre, è bello sapere che ora occorrono circa 150 ms per caricare uno script.

risposta

35

Al momento Julia JIT compila l'intera libreria standard all'avvio. Siamo consapevoli della situazione e stiamo lavorando al caching dell'output JIT di LLVM per rimediare alla situazione, ma fino ad allora non c'è modo di aggirarlo (tranne che per usare REPL).

+17

Questo è stato implementato in Julia Nightly e sarà incluso nella versione 0.3. Il tempo di avvio è notevolmente migliorato. –

88

La risposta di Keno è azzeccata, ma forse potrei dare un po 'più di dettagli su cosa sta succedendo e su cosa intendiamo fare al riguardo.

Attualmente c'è solo una modalità JIT LLVM:

  • C'è un interprete molto banale per alcuni semplici dichiarazioni di alto livello.
  • Tutti gli altri codici vengono inseriti nel codice macchina prima dell'esecuzione. Il codice è specializzato in modo aggressivo utilizzando i tipi di runtime dei valori a cui viene applicato il codice, propagati attraverso il programma utilizzando l'inferenza di tipo dinamica.

Questo è come Julia ottiene buone prestazioni anche quando il codice viene scritto senza annotazioni di tipo: se si chiama f(1) si ottiene il codice specializzato per Int64 - il tipo di 1 sui sistemi a 64 bit; se chiami f(1.0), ottieni una versione appena provata specializzata per Float64 - il tipo di 1.0 su tutti i sistemi. Poiché ogni versione compilata della funzione sa quali tipi otterrà, può funzionare alla velocità di tipo C. Puoi sabotare questo problema scrivendo e usando funzioni "type-unstable" il cui tipo di ritorno dipende dai dati di runtime, piuttosto che solo i tipi, ma abbiamo fatto molta attenzione a non farlo nella progettazione della lingua principale e della libreria standard.

La maggior parte di Julia è scritta in sé, quindi analizzata, derivata dal tipo e jitted, quindi l'avvio automatico dell'intero sistema richiede circa 15-20 secondi. Per renderlo più veloce, abbiamo un sistema a fasi in cui analizziamo, digitiamo inferenza e quindi memorizziamo nella cache una versione serializzata dell'AST derivato dal tipo nel file sys.ji. Questo file viene quindi caricato e utilizzato per eseguire il sistema quando si esegue julia. Nessun codice LLVM o codice macchina è memorizzato nella cache in sys.ji, tuttavia, per cui è necessario eseguire tutte le operazioni LLVM ogni volta che viene avviato julia, che pertanto richiede circa 2 secondi.

Questo ritardo di avvio di 2 secondi è piuttosto fastidioso e abbiamo un piano per risolverlo. Il piano di base è quello di essere in grado di compilare interi programmi Julia in binari: o eseguibili eseguibili o .so/.dylib librerie condivise che possono essere chiamate da altri programmi come se fossero semplicemente librerie C condivise. Il tempo di avvio di un binario sarà come qualsiasi altro programma C, quindi il ritardo di avvio di 2 secondi svanirà.

Addendum 1: Da novembre 2013, la versione di sviluppo di Julia non ha più un ritardo di avvio di 2 secondi poiché precompila la libreria standard come codice binario. Il tempo di avvio è ancora 10 volte più lento di Python e Ruby, quindi c'è spazio per miglioramenti, ma è piuttosto veloce. Il prossimo passo sarà quello di consentire la precompilazione di pacchetti e script in modo che possano essere avviati alla stessa velocità di Julia stessa.

Addendum 2: Da giugno 2015, la versione di sviluppo di Julia precompila automaticamente molti pacchetti, consentendo loro di caricarsi rapidamente. Il prossimo passo è la compilazione statica di interi programmi Julia.

+6

Ho visto un numero di commenti sul Web dall'ultimo anno o giù di lì che indica che gli eseguibili compilati/oggetti condivisi sono l'obiettivo per Julia, ma nessuna indicazione di alcun progresso. Puoi offrire qualche idea su dove stanno le cose? – dfreeman

+2

Jameson Nash e Isaiah Norton hanno fatto molti progressi, ma non è ancora arrivato. – StefanKarpinski

+23

Questa funzionalità è ora completa e unita a Julia master. Invece di prendere ~ 1.5 secondi sul mio sistema per avviare Julia, ora occorrono ~ 150 millisecondi - un impressionante 10x di accelerazione. Se riusciamo ad accumulare un altro 10x di accelerazione, il che è del tutto possibile, il tempo di avvio di Julia sarà paragonabile a quello di Ruby e Python. – StefanKarpinski

Problemi correlati