Domanda

mi riferisco a questa discussione . Non ho mai scritto alcun codice in C o in C ++. Non ho alcun background CS. Tuttavia ho lavorato come sviluppatore Java per 5 anni e ora ho deciso di saperne di più su CS e fare un po 'recuperando.

È stato utile?

Soluzione

Quando si esegue una determinata porzione di codice, ogni volta che si chiama una funzione standard del tempo di esecuzione è leggermente superiore al dumping lì il codice contenuto in tale funzione. Scarico ogni volta l'intero codice contenuto in una funzione è dall'altra unmainteinable fine perché porta ovviamente ad una marea di duplicazione del codice.

Inlining risolve il problema di prestazioni e la manutenibilità lasciando si dichiara la funzione di in linea (almeno in C ++), in modo che quando si chiama quella funzione - invece di avere la vostra applicazione saltare in fase di esecuzione -. il codice nella funzione inline viene iniettato in fase di compilazione ogni volta che, data la funzione si chiama

L'unico lato negativo di questo è che - se in linea grandi funzioni che si chiama un sacco di volte - la dimensione del vostro programma può significativamente aumentare ( best practice suggerire di farlo solo su piccole funzioni davvero) .

Altri suggerimenti

http://en.wikipedia.org/wiki/Inlining

In informatica, l'espansione in linea, o inline, è un'ottimizzazione del compilatore che sostituisce un sito chiamata di funzione con il corpo del chiamato. Questa ottimizzazione può migliorare il tempo e l'utilizzo dello spazio in fase di esecuzione, presso l'eventuale costo di aumentare la dimensione del programma finale.

Come sviluppatore Java, in genere non si deve preoccupare di metodo inline. compilatore Just-in-time di Java può e lo farà automaticamente nella maggior parte dei luoghi in cui ha senso.

IDE come Eclipse possono avere una funzione che permette di INLINE metodi a livello di codice sorgente - non fare questo per le prestazioni, solo per la leggibilità del codice (ad esempio quando ci si rende conto che il metodo appena chiama una altro metodo senza aggiungere nulla di utile per sé).

Norman Maurer spiega al suo blog JVM e JIT linea funzionalità del genere

  

Inlining è una tecnica che fondamentalmente solo "in linea" un metodo in un altro e ottenere così liberarsi di una chiamata di metodo. Il JIT rileva automaticamente i metodi "a caldo" e cercare di inline per voi. Un metodo è considerato "caldo" se è stato eseguito più volte X, dove X è una soglia che può essere configurato con un JVM flag quando si avvia java (10000 è il valore predefinito). Questo è necessario come inlining tutti i metodi farebbe più male di ogni altra cosa, a causa dell'enorme byte-code prodotta. Oltre a questo la squadra può "tornare" precedente codice inline quando un'ottimizzazione si rivela essere sbagliato in uno stato più tardi. Ricordate il JIT acronimo di Just in Time e così ottimizzare (che comprende inline ma anche altre cose), mentre esegue il codice.

Anche con un avvertimento

  

Ma anche se la JVM considera un metodo di essere "caldo" potrebbe non inline esso. Ma perché? Uno dei motivi più probabile è che si tratta di solo grande per ottenere inline.

E si può trovare un esempio molto semplice di codice per inlining un codice Java all'indirizzo Eva Andreasson Java mondo post . È possibile trovare la parte correlata della posta al di sotto.

  

Molte ottimizzazioni cercano di eliminare le istruzioni a livello macchina di salto (ad esempio, JMP per architetture x86). Un'istruzione di salto cambia istruzione registro puntatore e quindi trasferisce il flusso di esecuzione. Questa è un'operazione costosa rispetto ad altre istruzioni di montaggio, che è per questo che è un obiettivo comune per ridurre o eliminare. Un ottimizzazione molto utile e ben noto che gli obiettivi di questo si chiama inlining. Dal momento che il salto è costoso, può essere utile per inline molte chiamate frequenti per piccoli metodi, con diversi indirizzi di ingresso, in funzione chiamante. Il codice Java in annunci da 3 a 5 esemplifica i vantaggi della messa in linea.

Listing 3. metodo chiamante

int whenToEvaluateZing(int y) {
   return daysLeft(y) + daysLeft(0) + daysLeft(y+1);
}

Listato 4. metodo denominato

int daysLeft(int x){
   if (x == 0)
      return 0;
   else
      return x - 1;
}

Listato 5. inline metodo

int whenToEvaluateZing(int y){
   int temp = 0;

   if(y == 0) temp += 0; else temp += y - 1;
   if(0 == 0) temp += 0; else temp += 0 - 1;
   if(y+1 == 0) temp += 0; else temp += (y + 1) - 1;

   return temp; 
}
  

In annunci da 3 a 5 il metodo chiamante fa tre chiamate a un   metodo piccola, che supponiamo per amore di questo esempio è più   vantaggioso per inline piuttosto che saltare a tre volte.

     

Potrebbe non fa molta differenza per inline un metodo che viene chiamato   raramente, ma inlining un metodo cosiddetto "caldo" che è spesso   chiamato potrebbe significare una grande differenza in termini di prestazioni. inlining anche   rende spesso modo per ulteriori ottimizzazioni, come mostrato nel Listato 6.

Listato 6. Dopo inlining, ottimizzazioni possono essere applicati

int whenToEvaluateZing(int y){
   if(y == 0) return y;
   else if (y == -1) return y - 1;
   else return y + y - 1;
}

Come già detto in altre risposte, inlining viene fornito con un costo. Di solito questo è considerato piccolo, tuttavia quando in realtà misurando potreste essere sorpresi e imparare che potrebbe essere maggiore di quello che si guadagna (in modo quello che gli altri dicono è vera:. non ottimizzare a meno che non avete misurato)

Vale la pena notare che nel kernel di Linux hanno iniziato a non-inline funzioni originariamente inline qualche tempo fa perché il costo era troppo alto (funzioni più grandi consumato più della cache di memoria della CPU, e le cache miss risultanti erano più costoso di una semplice chiamando la funzione che avevano lo scopo di essere inline). Vedere "Capitolo 15: La malattia inline" in doc / Documentazione / processo / codifica-style.rst per ulteriori dettagli.

In sostanza, in C / C ++, il compilatore può inline funzioni, il che significa che piuttosto che fare una chiamata di funzione per fare questa operazione, il codice verrà aggiunto al blocco della funzione di chiamata, quindi sarà come se non fosse mai stata una chiamata di funzione separata.

Questo andrà più in dettaglio: http://www.codersource.net/cpp_tutorial_inline_functions.html

Inlining riferisce alla fase di compilazione ottimizzazione in cui una piccola funzione di codice sarà iniettato nella funzione chiamante piuttosto che richiede una chiamata separata.

Le risposte di ottimizzazione del compilatore sono corrette. V'è un altro uso, anche se - in refactoring , inlining consiste nel sostituire una chiamata di metodo con il corpo del metodo e quindi rimuovendo il metodo. Vedere Metodo Inline . Ci sono refactoring simili, come Inline Classe .

EDIT: Si noti che refactoring viene fatto manualmente o con un attrezzo; in entrambi i casi si tratta di cambiare il codice sorgente.

Le funzioni inline sono utilizzati in genere in C ++ file di intestazione non Java. Un file C ++ intestazione di solito non contiene codice implementato ed è considerato un'interfaccia al file cpp lo stesso nome, che non contengono solitamente il codice implementato. E 'legale per includere una funzione inline in un file di intestazione, di solito una piccola funzione leggera. funzioni inline non hanno un costo, quindi non dovrebbero essere grandi operazioni richiedono molta memoria. Per piccole routine il calo di prestazioni è minimo e sono più utilizzati per convenienza.

In quella discussione, Jon Skeet menzioni client JVM (hotspot) JVM v Server con i miglioramenti delle prestazioni disponibili in fase di esecuzione se il JIT (just-in-time) compilatore è consentito portare miglioramenti basati sul tempo. Questo è il "come si fa" in Java.

In origine, piccole sezioni di codice che non sono stati chiamati da molti posti sarebbe "inline" dal compilatore, il che significa che ciò che è stato chiamato da un solo elemento sarebbe stato posto direttamente nel percorso di istruzione di codice di puntatore, facendo un ramo funzione e costi di ritorno maggiore potenza del processore di un semplice svolgimento di loop o chiamata di funzione e l'immissione delle istruzioni "proprio lì"

Oggi, Singleton è oggetto di discussioni più pagine e loop-srotolamento così come qualcosa di simile a inlining sono un po 'rimossi dal loro contesto originale (s). Si può leggere un lavoro molto informato di Dov Bulka sulla questione per ottenere il C / C ++ prendere in materia. Per Java, lo studio della sua ricca lib di in java.util servirebbe meglio le esigenze di studio delle problematiche inlining e compilatore profonda - è possibile ottenere appeso radicata guerra intramurale merlata su strutture di dati, che sorvolare chiamate in codice a 16 bit, e andare senza fine sul tuo curva di apprendimento.

Si può fare instanceof in Java, che assomiglia a un vf-tavolo (senza gente di calore, per favore), ma pensare ad esso come hai scritto in un linguaggio fortemente tipizzato - e ora sarà la scrittura in una lingua dove stringa può Runaway facilmente rovistando in cui non ha alcuna attività. Recentemente ho provato a scrivere il codice che ha costruito un'immagine in Java, farlo dal codice C. Presto mi ritrovai a guardare al tavolo OXR per crittografia forte - che non ha nulla a che fare con il codice che stavo scrivendo.

Come si scrive una classe string in C / C ++ che ha un piccolo buffer per stringhe in 32 byte e trappole puntatori in modo che operano esclusivamente sulla stringa?

Non cercare di prendere in giro voi o niente, è solo un ottimo punto di partenza piuttosto che inlining e la scienza del compilatore.

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