Calcolare lo Startup time di Emacs

Provate ad eseguire il seguente codice elisp

(message "Emacs loaded in %s with %d garbage collections."
           (format "%.2f seconds"
                   (float-time
                   (time-subtract after-init-time before-init-time)))
           gcs-done)

cosa vi stampa? A me sul laptop di lavoro da

Emacs loaded in 2.23 seconds with 35 garbage collections.

poi riprovo da quello di casa.

In generale è interessante analizzare lo start-up time per cercare di ridurlo.

A tale fine entra in gioco l’interazione del garbage collector, il cui comportamento può essere indirettamente condizionato tramite il valore di un paio di variabili tipo gc-cons-threshold.

Come tecnica di ottimizzazione ho visto in giro la seguente: all’inizio del config si mette un valore alto come 50MB.
(setq gc-cons-threshold (* 50 1000 1000))
E poi alla fine della config lo si abbassa a 2MB.
(setq gc-cons-threshold (* 2 1000 1000))

Un’altra variable interessante da analizzare è gc-cons-percentage, che invece rappresenta la % di memoria della heap utilizzata per allocare lisp objects da Emacs.

Detto questo quel threshold non viene utilizzato in modo “diretto”. Nel senso, da quello che ho capito, il GB si può potenzialmente attivare successivamente al superamento della treshold. La cosa non è sincrona in ogni caso, nel senso che puoi passare la treshold ma il GB si attiva solo più tardi.

Ultima cosa: il pacchetto esup è utile per misurare lo start-up time di Emacs. La cosa utile del pacchetto è che effettua del profiling, ovvero ti permette di capire dove il tempo di startup viene speso in modo da rendere più efficiente la config.

Riferimenti:

Anche io, come te, ho sempre calcolato lo startup time di Emacs manualmente.
Ma, qualsiasi cosa che tu possa immaginare, esiste già in Emacs, compreso questo!
Prova ad eseguire M-x emacs-init-time

Riguardo la garbage collection, personalmente preferisco disabilitarla completamente:
(setq gc-cons-threshold most-positive-fixnum)

Questo aumenta notevolmente la velocità di Emacs,
poi faccio manualmente garbage collection con il comando garbage-collect.

1 Like

Hmmm, mai provato a usare Emacs senza garbage collector. Sicuramente lo proverò. Ho solo paura che prima o poi mi dimentico di chiamare il garbage collector e mi saturo la RAM. :sweat:

Se ho notizie aggiorno direttamente qui :smiley: