Domanda

Considerando che si sta cercando solo di ottimizzare per la velocità, quali sono le buone euristiche per decidere se una funzione inline o no? Ovviamente le dimensioni del codice dovrebbe essere importante, ma ci sono altri fattori tipicamente utilizzati quando (diciamo) gcc o CPI è determinare se all'inline una chiamata di funzione? C'è stato qualche lavoro accademico significativa nella zona?

È stato utile?

Soluzione

un alcuni paragrafi su questo, con alcuni link in basso:

  • In aggiunta ai problemi di dimensione della memoria e della cache, un'altra considerazione è la pressione registro . Dal punto di vista del compilatore "variabili aggiunte dalla procedura inline può consumare ulteriori registri, e in una zona dove la pressione registro è già alto puo forzare fuoriuscite che provoca RAM aggiuntiva accessi."

Lingue con compilatori JIT e di classe runtime di carico hanno altri compromessi in quanto i metodi virtuali non sono noti staticamente, ma il JIT possono raccogliere runtime informazioni di profilo, come la frequenza chiamata di metodo:

  • progettazione, implementazione e valutazione di ottimizzazioni in un a Just- -Time Compiler (per Java) parla di metodo inline di metodi statici e le classi caricate dinamicamente e dei suoi miglioramenti sulle prestazioni.

  • Praticare JUDO: Java sotto Ottimizzazioni dinamiche sostiene che il loro "politica inlining si basa sulla dimensione del codice e informazioni di profilatura. Se la frequenza di esecuzione di una voce metodo è sotto una certa soglia, il metodo non viene espansa in linea perché viene considerato come un metodo a freddo. Per evitare codice esplosione, non InLine un metodo con una dimensione bytecode di più di 25 byte.... Per evitare inlining lungo una catena di chiamate profondo, inlining arresta quando la dimensione bytecode inline accumulata lungo la catena di chiamate supera i 40 byte." Anche se hanno runtime informazioni di profilo (frequenza chiamata di metodo) sono ancora attenti ad evitare inlining funzioni di grandi dimensioni o catene di funzioni per prevenire gonfiare.

Una ricerca su Google Scholar rivela una serie di documenti, come ad esempio

Una ricerca su Google Libri rivela un certo numero di libri con documenti o capitoli sulla funzione inlining in vari contesti.

  • Il Compiler Handbook design: Ottimizzazioni e Codice macchina Generation ha un capitolo sulle tecniche Statisical e Machine Learning in compilatore design, con l'euristica per impostare vari parametri, profilazione dei risultati. Questo capitolo fa riferimento al Vaswani et al carta Microarchitettura modelli empirici sensibili per il compilatore Ottimizzazioni dove si propongono "l'uso di modelli empirici tecniche per la costruzione di modelli sensibili microarchitettura per ottimizzazioni del compilatore".

  • (Alcuni altri libri parlano di inling dal punto di vista del programmatore, come ad esempio C ++ per il gioco programmatori , which parla dei pericoli di inlining funzioni troppo spesso e le differenze tra inlining e macro. I compilatori spesso ignorano le richieste in linea del programmatore se possono stabilire che avrebbero fatto più male che bene; questo può essere sovrascritto con le macro come ultima risorsa.)

Altri suggerimenti

Una chiamata di funzione implica codice aggiuntivo (la funzione prologo, dove il nuovo stack frame viene impostato, e la funzione epilogo, dove è ripulito). Se il compilatore vede che il codice funzione è piccolo in confronto al prologo ed epilogo, si può decidere che non vale la pena di fare una chiamata effettiva, e la funzione inline.

L'unico vantaggio che vedo di chiamare una funzione invece di inlining esso sono connessi alla dimensione. Credo che inlining una funzione poi srotolare un ciclo può risultare in un aumento significativo dimensioni.

per quanto ho visto, dimensione funzionale è l'unico fattore di compilatori utilizzati per determinare in linea. Tuttavia, se si fa il profilo dell'ottimizzazione guidata (PGO), credo che il compilatore è in grado di utilizzare altre variabili, come il numero di chiamate / ora impostazione della chiamata.

In .NET è si basa soprattutto sulla dimensione. Misurare la dimensione della funzione di genitore e la funzione del bambino in byte compilati. Quindi misurare la dimensione della funzione combinata. Se la funzione combinata è più piccolo, allora inlining è una buona idea.

La ragione di questo è quello di rendere possibile per spingere quanto più codice nella cache della CPU possibile. cache miss sono molto più costosi di quelli chiamate di funzione in moderne CPU.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top