2014-05-21 16 views
16

Sono interessato ad esaminare l'output di assembly x86 del compilatore standard di Go per vedere se il mio codice viene realmente convertito in codice di assemblaggio ragionevolmente efficiente; si spera che, analizzando e esaminando l'output di assemblaggio, potrei avere un indizio su dove/come dovrei riscrivere il mio codice Go per ottenere il massimo delle prestazioni. Ma quando esamino il codice usando la flag -S, Go sputa un casino! Vorrei due cose:Uscita del gruppo Golang facile da leggere?

  1. C'è un modo per rendere il compilatore Go discarica l'uscita di montaggio in un file, non solo stamparlo su Terminal?

  2. Inoltre, c'è un modo per rendere separato il compilatore Go dal codice assembly in funzioni separate, con etichette? So che alcune funzioni potrebbero essere inline e quindi non apparire nel codice assembly. Quello che vedo è solo un insieme omogeneo di assemblaggi che è quasi impossibile da capire.

+5

1) Che dire dell'utilizzo di '>' o di qualsiasi cosa la shell dei comandi supporti per reindirizzare l'output di un comando in un file? – Michael

+1

Inoltre, il tuo approccio alla profilazione guardando il codice assembly potrebbe non essere il più produttivo. Hai esaminato gli strumenti di profilazione disponibili per il codice Go? (ad esempio http://blog.golang.org/profiling-go-programs) – Michael

+1

Sono d'accordo con te, l'output di assemblaggio ha bisogno di miglioramenti. Il problema è che il compilatore Go non genera un vero assemblaggio. Genera qualcosa che assomiglia molto all'assemblaggio ma contiene un sacco di pseudo-istruzioni che verranno espanse dal linker.Solo dopo aver eseguito il collegamento, viene prodotto l'assemblaggio effettivo (e immediatamente assemblato). – fuz

risposta

18
  1. È possibile reindirizzare l'output in un file in questo modo:

    go tool 6g -S file.go > file.s 
    
  2. È possibile disattivare l'ottimizzazione con -N:

    go tool 6g -S -N file.go 
    

In alternativa, puoi usare gccgo:

gccgo -S -O0 -masm=intel test.go 

che genererà test.s. Puoi giocare con -O0/1/2/3 per vedere le diverse ottimizzazioni.

+0

Grazie! Usare GCCGO è una buona idea. – Gautam

+1

'go build -gcflags -S test.go> test.s' dovrebbe funzionare anche (secondo https://golang.org/doc/asm) – rkusa

+4

' go tool comile -S file.go> file.S' poiché 'go1.5' –

14

Non è consigliabile utilizzare l'output di -S in quanto il linker Go può modificare molto ciò che viene scritto nel codice oggetto. Ti dà un'idea di cosa sta succedendo.

L'output dell'assemblatore go è piuttosto non standard.

Quando voglio fare questo uso sempre objdump che ti darà una bella uscita standard dell'assemblatore.

Ad esempio per x86/amd64

objdump -d executable > disassembly 

E per ARM (per ottenere i nomi di registro per essere lo stesso utilizza Go)

objdump -M reg-names-raw -d executable > disassembly 
8

Run go tool objdump sul file eseguibile risultante.

Per limitare l'output a funzioni interessanti, utilizzare l'opzione -s.

Problemi correlati