2015-02-28 13 views
8

Di tanto in tanto affronto i concetti come zero immondizia o l'uso efficiente della memoria ecc. Come un esempio nella sezione Funzionalità del pacchetto noto httprouter è possibile visualizzare quanto segue:Golang. Zero propagazione di immondizia o uso efficiente della memoria

Zero rifiuti: L'abbinamento e la spedizione processo genera zero byte di spazzatura. Infatti, le uniche allocazioni dell'heap create sono costruendo la fetta delle coppie chiave-valore per i parametri del percorso. Se il percorso della richiesta non contiene parametri, non è necessaria una singola allocazione dell'heap.

Anche questo pacchetto mostra ottimi risultati benchmark rispetto al http.ServeMux di libreria standard:

BenchmarkHttpServeMux   5000  706222 ns/op   96 B/op  6 allocs/op 
BenchmarkHttpRouter   100000  15010 ns/op   0 B/op  0 allocs/op 

quanto ne capire il secondo ha (dalla tabella) senza allocazione di memoria heap e media nulla numero di assegnazioni fatte per ripetizione.

La domanda: Voglio imparare una conoscenza di base della gestione della memoria. Quando il netturbino alloca/rilascia la memoria. Che cosa significano i numeri di riferimento (le ultime due colonne della tabella) e in che modo le persone sanno quando si sta distribuendo l'heap?

Sono assolutamente nuovo nella gestione della memoria, quindi è davvero difficile capire cosa sta succedendo "sotto il cofano". Gli articoli che ho letto:

risposta

8

Il garbage collector non alloca la memoria :-), si rilascia solo. Il garbage collection di Go si sta evolvendo, per i dettagli guarda il documento di progettazione https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/preview?sle=true e segui la discussione sulle mailing list di Golang.

Le ultime due colonne nell'output del benchmark sono estremamente semplici: quanti byte sono stati allocati in totale e quante allocazioni sono avvenute durante una iterazione del codice di riferimento. (Questa allocazione è fatta dal tuo codice, non dal garbage collector). Poiché qualsiasi allocazione è una potenziale creazione di rifiuti, la riduzione di questi numeri potrebbe essere un obiettivo di progettazione.

Quando le cose sono allocate nello heap? Ogni volta che decide il compilatore Go! Il compilatore tenta di allocare sullo stack, ma a volte deve utilizzare l'heap, soprattutto se un valore viene ignorato dagli ambiti stack-based locali. Questa analisi di escape è attualmente in fase di rielaborazione, quindi non è facile dire quale valore sarà heap o stack-allocato, specialmente perché questo sta cambiando dalla versione del compilatore alla versione.

Non sarei troppo ossessionato dall'evitare allocazioni fino a quando il tuo benchmark non mostrerà troppo il sovraccarico di GC.

+0

@OP - "undergoing rework" in questo caso significa che ci sono dei momenti in cui le variabili escono durante l'analisi di escape che non dovrebbero - e il team di Go ne è a conoscenza. Ciò significa che stai ricevendo allocazioni di heap quando in realtà dovresti ricevere un'allocazione di stack. C'è un documento affascinante su questo da qualche parte (non riesco a trovarlo su go-dev al momento)."Analisi di fuga" il termine sarà utile per la tua ricerca. Bella risposta Volker :) –

Problemi correlati