Costruisci un Emacs 25 minimo per i test unitari


10

Vorrei creare una variante minimale del trunk Emacs per testare l'unità del mio pacchetto Emacs Lisp. La build non ha bisogno di GUI, nessun supporto per le immagini, ecc. Dovrebbe essenzialmente essere solo un interprete Emacs Lisp minimo con le librerie Emacs Lisp di base e dovrebbe essere veloce , idealmente in meno di cinque minuti.

Attualmente sto passando --with-x-toolkit=no --without-x --without-alla ./configure. Al termine, mi dice che tutte le funzionalità di Emacs sono disabilitate, ma sfortunatamente la build impiega ancora quasi dieci minuti .

Capisco che potrebbe essere impossibile far costruire Emacs più velocemente, ma ciò che mi fa meravigliare è che con le stesse bandiere che Emacs 24.5 costruisce in circa due minuti .

Qual è la ragione di questa grande differenza, e posso ottenere il trunk Emacs per costruire velocemente come Emacs 24.5?

E, in una domanda correlata, come ottenere Emacs per costruire tranquillamente? Attualmente quasi l'80% dell'output del mio test unitario sta costruendo Emacs. Idealmente, mi piacerebbe make installnon stampare affatto.


Hai intenzione di farlo su una sorta di piattaforma CI? In caso contrario, che tipo di computer stai usando? Ovviamente la velocità di costruzione dipenderà molto dal tuo processore, ma per me ./configure --with... && make -j (number of cores * 1.5)termina in 30 secondi. Se si esegue su un computer locale, assicurarsi di utilizzare l'argomento -j per creare. C'è una buona ragione per te make install? Questo aggiungerà un po 'di tempo che potresti evitare se avessi eseguito emacs dalla directory src.
Jordon Biondo,

È Travis CI, ma non vedo perché sia ​​importante? È la grande differenza tra due diverse versioni di Emacs nella stessa macchina che mi piacerebbe aver spiegato. IOW perché il trunk è cinque volte più lungo per essere costruito sullo stesso sistema ?
lunaryorn,

La creazione da un repository deve creare determinati file, che sono già presenti nei tarball distribuiti.
politza,

@politza Quali file? So che devo correre ./autogen.shper generare configure, ma è questione di secondi, non di minuti.
lunaryorn,

2
@lunaryom Hai tre domande separate qui. 1: come compilare emacs velocemente, 2: perché emacs 25 costruisce più lentamente di emacs 24.5 e 3: come far make installfunzionare silenziosamente. Quindi, ti preghiamo di dividerli in 3 domande in modo che possano essere monitorati separatamente e modificarlo di conseguenza per rimanere con una domanda.
roccioso,

Risposte:


8

Il motivo per cui 24.5 viene creato così rapidamente per te è che i .elcfile sono effettivamente distribuiti nel tarball, vedi make-dist . Quando si costruisce da Git, la maggior parte del tempo viene impiegata nella compilazione dei .elfile .elc. Ottimizzando il codice C, la compilazione Lisp può andare più veloce, ma richiede ancora molto tempo. Confronta i tempi di costruzione usando le tue impostazioni originali (~ 14 vs ~ 1 minuti) con una build usandoCFLAGS='-O2 -march=native' (~ 9 vs ~ 1,5 minuti).

Inoltre, la clonazione da git richiede circa un minuto, mentre il download e il disimballaggio del tarball richiede circa 5 secondi. Confronta i tempi di compilazione tra le versioni quando scarichi l'archivio git da github (~ 5, ~ 6, ~ 8 minuti rispettivamente per v24.5, master ed emacs-25. Come puoi vedere, quando non usi un tarball di distribuzione, tutti i i tempi di costruzione sono almeno dello stesso ordine di grandezza (non sai perché emacs-25 è stato più lento del master, potrebbe essere una variazione casuale o un codice obsoleto è stato rimosso nel master?).

E, in una domanda correlata, come ottenere Emacs per costruire tranquillamente? Attualmente quasi l'80% dell'output del mio test unitario sta costruendo Emacs. Idealmente, mi piacerebbe make installnon stampare affatto.

Puoi sempre reindirizzare l'output a /dev/null. Per i miei esperimenti ho reindirizzato l' make installoutput per grep -E '^(make|[A-Z])'ridurre l'output (il javascript di Travis CI che formatta il registro sul web ha avuto problemi con l'output completo).

posso fare in modo che Emacs trunk venga compilato più velocemente di Emacs 24.5?

No (o sì, nel senso che puoi ottenere Emacs 24.5 per costruire (quasi) lentamente quanto il tronco di Emacs: p). Ma quello che puoi fare è salvare la build di Emacs e scaricare semplicemente il risultato memorizzato nella cache per test unitari. L'ho implementato nel ramo di upload del mio fork di emacs-travis, ecco un esempio di utilizzo di yasnippet : il tempo di installazione di Emacs è di ~ 2,5 secondi.


3

Ecco vari suggerimenti.

  1. Nessun file elc.

Come indicato di seguito, la compilazione di tutti i file lisp rappresenta almeno il 10% delle volte. Un modo per disabilitare quello è modificare la destinazione loaddefs nel file lisp/Makefilee cambiarla in:

    $(lisp)/loaddefs.el: $(LOADDEFS)
          true
  1. Nessuna ottimizzazione del compilatore o tabelle dei simboli del debugger

Attualmente sto passando --with-x-toolkit = no --without-x --with-all a ./configure.

Sono stato in grado di ridurre il tempo di compilazione C a 1/4 del tempo (da poco meno di un minuto a 16 secondi) in src semplicemente cambiando i flag di compilazione predefiniti. L'impostazione predefinita CFLAGS ho avuto erano state: -g -O3.

Quindi usa invece CFLAGS=''.

  1. Non eseguire make install, ma esegui semplicemente gli emacs creati dalla directory src .

Come indicato di seguito, un altro 10% delle volte è nella creazione di documenti. Anche se non ho avuto tempo, non c'è dubbio che copi i file e comprimi i file elisp make install. Quindi non farlo. Se si desidera ripetere i grafici dei tempi, eseguire remake --profile.

Le osservazioni sopra riportate si basano sul seguito ....


Il primo passo è capire dove viene impiegato il tempo per capire come ridurlo. Fortunatamente per qualcosa come Emacs, di recente ho scritto (o piuttosto esteso) uno strumento per aiutarti a scoprirlo. Ho aggiunto --profileun'opzione al remake (un fork di GNU make) che ti dirà quanto tempo viene speso in obiettivi specifici.

Ho provato a creare un'istantanea recente e sì, ci vogliono circa 10 minuti. Se non hai installato il remake, ho una panoramica delle informazioni di profilazione che puoi utilizzare della mia corsa. Uso kcachegrind per visualizzare le informazioni, ma potrebbero esserci altri strumenti là fuori per gli strumenti di visualizzazione. C'è un png nell'essenza che è uno screenshot della corsa.

Ora ai dettagli ...

A mio avviso, circa il 20% del tempo è dedicato alla creazione di file lisp e di informazioni che non è necessario. In realtà un po 'di più viene speso nei file lisp che nei file di informazioni. Probabilmente potresti cambiare il Makefile per saltarlo.

Potrebbe essere interessante confrontarlo con emacs 24. La mia ipotesi è che le dimensioni di entrambi siano cresciute proporzionalmente.

Se c'è interesse (che puoi mostrare con voti positivi), suggerirò hack specifici al Makefile. Tuttavia, questo da solo dovrebbe essere sufficiente per qualcuno motivato a lavorare da.


"Il 20% del tempo è dedicato alla costruzione di lisp" - Ho clonato il repo emacs-travis di lunaryorn sembra che make lispstia impiegando circa il 60% per Emacs 25: travis-ci.org/npostavs/emacs-travis/builds/91107858 . E un grande pezzo di make srcsta anche compilando lisp, quindi mi chiedo come conciliare queste misurazioni. In Emacs 24 sembra che compili solo cc-*.elfile durante make lisp, è un bug?
npostavs

Inoltre, ciò potrebbe riguardare l'illusione ottica, ma mi sembra che la tua immagine di profilazione aggiunga solo un totale di circa il 50%.
npostavs

Il remake di @npostavs profila solo il tempo del target, non include se stesso. È possibile e probabile che con tutti i file e le directory in lisp, ci sia un considerevole tempo speso in "remake" / "make" nel calcolo di cosa rifare. Inoltre, anche se "remake" è un fork di make, quindi quello che fanno è simile, per confronti più stretti dovresti confrontare i tempi dell'output di profiling del remake con "remake" senza profiling, non "make". E anche con lo stesso remake / crea una versione. Infine, anche se uno può cavillare con i% e così via, i suggerimenti generali sembrano applicarsi usando i tuoi dati.
roccioso

Inoltre, la mia misurazione stava usando ciò CFLAGS=''che rende la compilazione C più veloce e la compilazione lisp più lenta. A quanto pare, l'utilizzo CFLAGS='-O2 -march=native'è più veloce nel complesso per Emacs 25, sebbene più lento per Emacs 24.5: travis-ci.org/npostavs/emacs-travis/builds/91142923
npostavs

@npostavs Osservate: l'impostazione di CFLAGS "rende la compilazione C più veloce e la compilazione lisp più lenta." Ma se hai intenzione di eseguire un singolo test, non sono sicuro che il tempo complessivo: una sorta di compilazione / build C ottimizzata + compilazione LISP + esecuzione del test LISP sarà inferiore alla compilazione / build C non ottimizzata + nessun LISP compilare + esecuzione test LISP.
roccioso
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.