Quando è utile vale la pena?

3

I compilatori moderni spesso funzioni inline quando decidono che ne vale la pena.

Ma ecco che arriva la mia domanda: come si definisce se è ottimale la funzione in linea in un dato momento, o più importante come decidere che dovrebbe essere evitato?

    
posta mrpyo 02.12.2014 - 00:25
fonte

3 risposte

8

È un compromesso tra spingere i parametri e i registri sullo stack e un salto più il salto indietro e ripristinarlo tutto contro il codice gonfiato.

Un altro fattore è la possibilità di altre ottimizzazioni disponibili sul codice in linea. Soprattutto quando alcuni dei parametri sono noti.

Ad esempio, l'inlining printf quando viene chiamato con una stringa statica consentirà al compilatore di eliminare l'analisi della stringa in fase di esecuzione ed emettere direttamente il codice di formattazione. In altre parole, printf("%d", x); può essere ottimizzato a itoa e a write .

    
risposta data 02.12.2014 - 00:41
fonte
4
  • A meno che la chiamata sia su un percorso davvero molto caldo (trecentosessanta milioni di volte), l'aspetto più rilevante è la dimensione del codice: se si riduce, in linea. Se cresce, no. A meno che la tua routine sia veramente piccola, codice non in linea può essere più cache-friendly e quindi più veloce per le routine chiamate in più posti.

  • Nel percorso veramente hot, il problema man tend è il tempo di esecuzione: il tempo non è più necessario per spingere gli argomenti e restituire l'indirizzo, ramificare, recuperare il risultato, ritorno. L'aspetto più importante potrebbe essere la previsione di ramificazione migliorata.

risposta data 02.12.2014 - 16:46
fonte
1

È anche probabile che aiuti quando gli argomenti sono costanti, poiché puoi spesso eliminare interi percorsi di codice. Semplice esempio:

function foo(b:Bool) {
  if (b) {
    lots;
    of;
    code;
  }
  else {
    and;
    even;
    more;
    code;
  }
}

Se b è una costante, questo aiuta. Argomenti di pari entità int che sono limiti di loop possono consentire lo svolgimento del ciclo nel corpo inline, e cosa no.

Inoltre, le funzioni integrate semplificano l'analisi delle evasioni, che può quindi aiutarti a evitare l'allocazione.

La riduzione del costo di invocazione è di solito insignificante. Il vantaggio effettivo derivante dall'integrazione delle funzioni è rappresentato dalle successive opportunità di ottimizzazione che possono sorgere quando si elimina l'indirezione e si possono combinare le informazioni del sito di chiamata e del callee.

Se è possibile raggiungere prestazioni significative risparmiando i costi di chiamata, è molto probabile che le JIT siano in grado di integrare i metodi virtuali, poiché elimina tutta la procedura indiretta coinvolta nella ricerca vtable. Mentre è necessario memorizzare più codice nella cache, non è necessario caricare il vtable.

    
risposta data 04.12.2014 - 12:17
fonte

Leggi altre domande sui tag