Question

Je me réfère à cette discussion . Je ne l'ai jamais écrit un code en C ou en C ++. Je n'ai pas arrière-plan CS. Cependant, je travaille en tant que développeur Java pour 5 ans et maintenant j'ai décidé d'en savoir plus sur CS et faire un peu de rattrapage.

Était-ce utile?

La solution

Lors de l'exécution d'un morceau de code donné, chaque fois que vous appelez une fonction standard le temps d'exécution est légèrement plus élevé que le dumping il le code contenu dans cette fonction. Dumping chaque fois que le code entier contenu dans une fonction est à l'autre bout unmainteinable parce qu'elle conduit évidemment à un gâchis de toute duplication de code.

Inlining permet de résoudre les performances et la question maintenabilité en vous déclarez la fonction (au moins en C ++) en ligne , de sorte que lorsque vous appelez cette fonction - au lieu d'avoir votre application sautiller lors de l'exécution -. le code dans la fonction en ligne est injectée au moment de la compilation à chaque fois que la fonction donnée est appelée

Le seul inconvénient est que - si vous les fonctions en ligne grandes que vous appelez beaucoup de temps - la taille de votre programme peut augmenter de manière significative ( meilleures pratiques suggère de le faire que sur les petites fonctions en effet) .

Autres conseils

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

Dans le calcul, l'expansion en ligne ou inline, est une optimisation du compilateur qui remplace un site d'appel de fonction avec le corps de l'appelé. Cette optimisation peut améliorer le temps et l'utilisation de l'espace à l'exécution, au coût possible d'augmenter la taille du programme final.

En tant que développeur Java, vous ne généralement pas à vous soucier de la méthode inline. Le compilateur Just-in-time Java peut et fera automatiquement dans la plupart des endroits où il est logique.

IDEs comme Eclipse peuvent avoir une fonctionnalité qui vous permet d'en ligne des méthodes au niveau du code source - jamais faire pour la performance, seulement pour la lisibilité du code (par exemple, lorsque vous vous rendez compte que la méthode appelle juste un autre méthode sans ajouter quoi que ce soit lui-même utile).

Norman Maurer explique son Eva Andreasson 's Java monde post . Vous pouvez trouver la partie correspondante du poste au-dessous.

  

De nombreuses optimisations tentent d'éliminer les instructions de saut au niveau de la machine (par exemple, pour les architectures JMP x86). Une instruction de saut change le registre pointeur d'instruction et transmet de ce fait le flux d'exécution. Ceci est une opération coûteuse par rapport à d'autres instructions de montage, ce qui explique pourquoi il est un objectif commun pour réduire ou éliminer. Un très utile et d'optimisation bien connue qui cible ce qu'on appelle inline. Depuis le saut est cher, il peut être utile inline de nombreux appels fréquents aux petites méthodes, avec différentes adresses d'entrée, dans la fonction appelante. Le code Java dans les Listings 3 à 5 illustre les avantages de inline.

Liste 3. Méthode appelant

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

Liste 4. méthode appelée

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

Listing 5. méthode inline

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; 
}
  

Dans les listes 3 à 5 la méthode d'appel fait trois appels à un   petite méthode, que nous supposons pour l'amour de cet exemple est plus   bénéfique à inline que de sauter trois fois.

     

Il ne pourrait pas faire beaucoup de différence à inline une méthode appelée   rarement, mais inline une méthode dite « à chaud » qui est souvent   appelé pourrait signifier une énorme différence dans la performance. inline aussi   fait souvent voie à d'autres optimisations, comme dans le Listing 6.

Listing 6. Après inline, plus d'optimisations peuvent être appliquées

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

Comme déjà mentionné dans d'autres réponses, inline est livré avec un coût. Habituellement, cela est considéré comme faible, mais quand en fait, vous mesurez peut-être surpris d'apprendre et qu'il pourrait être plus grand que ce que vous gagnez (si ce que les autres disent est vrai:. n'optimiser pas, sauf si vous avez mesuré)

Il est intéressant de noter que dans le noyau Linux, ils ont commencé un-inline fonctions à l'origine inline il y a quelque temps parce que le coût était trop élevé (fonctions plus importantes ont consommé plus de la mémoire cache du processeur, et les défauts de cache résultant étaient plus chers que tout appelant la fonction qui devaient être inline). Voir "Chapitre 15: La maladie en ligne" dans doc / Documentation / processus / codage style.rst pour plus de détails.

En fait, en C / C ++, le compilateur peut inline fonctions, ce qui signifie que, plutôt que de faire un appel de fonction pour faire cette opération, le code sera ajouté au bloc de la fonction d'appel, il sera comme si elle avait jamais été un appel de fonction distincte.

Ce sera plus en détail: http://www.codersource.net/cpp_tutorial_inline_functions.html

Inlining fait référence à l'optimisation de compilation où une petite fonction de code sera injecté dans la fonction d'appel plutôt que d'exiger un appel séparé.

Les réponses d'optimisation du compilateur sont corrects. Il y a un autre usage, bien - refactorisation , inline fait référence au remplacement d'un appel de méthode avec le corps du procédé et en éliminant ensuite le procédé. Voir Méthode Inline . Il y a refactorisations similaires, tels que Inline classe .

EDIT: Notez que refactoring se fait manuellement ou avec un outil; dans les deux cas, il implique la modification du code source.

Les fonctions inline sont généralement utilisés dans les fichiers d'en-tête de C pas Java. Un C ++ fichier d'en-tête ne contient généralement pas de code mis en œuvre et est considéré comme une interface au fichier cpp du même nom, qui ne contient généralement le code mis en œuvre. Il est légal d'inclure une fonction en ligne dans un fichier d'en-tête, généralement une petite fonction légère. Les fonctions inline viennent à un coût, donc ils ne devraient pas avoir de grandes opérations gourmandes en mémoire. Pour les petites routines de la perte de performance est minime et ils sont plus utilisés pour plus de commodité.

Dans cette discussion, Jon Skeet mentionne client jvm (hotspot) v Serveur jvm avec les améliorations de performance disponibles au moment de l'exécution si le JIT (just-in-time) compilateur est autorisé à apporter des améliorations en fonction du temps. C'est « comment faire » en Java.

A l'origine, les petites sections de code qui ne sont pas appelés à partir de nombreux endroits seraient « inline » par le compilateur, ce qui signifie que ce qu'on appelait un singleton serait placé directement dans le chemin de code de pointeur d'instruction, en faisant une branche de fonction et frais de retour plus de puissance de processeur qu'un simple déroulage de boucle ou d'appel de fonction et en plaçant les instructions « là »

Aujourd'hui, Singleton est l'objet de discussions à plusieurs pages et boucle ainsi que le déroulement quelque chose comme inline sont un peu retirés de leur contexte d'origine (s). Vous pouvez lire un travail très informé de Dov Bulka en la matière pour obtenir le C / C ++ prendre en la matière. Pour Java, l'étude de c'est riche des années lib dans java.util serait mieux répondre à vos besoins que l'étude des problèmes de inlining et compilateur profond - vous pouvez être accroché retranchée crénelée guerre intra-muros sur les structures de données, qui dissimulent les appels en code 16 bits, et aller sans fin sur votre courbe d'apprentissage.

Vous pouvez faire instanceof en Java, qui ressemble à une vf table (pas de gens de chaleur, s'il vous plaît), mais pensez à ce que vous avez écrit dans un langage fortement typé - va maintenant être écrit dans une langue où la chaîne peut emballement piquer facilement autour où il n'a pas d'affaire. J'ai récemment essayé d'écrire du code qui a construit une image en Java, en faisant que à partir du code C. Je me suis retrouvé en regardant bientôt à la table de OXR pour le cryptage fort - qui n'a rien à voir avec le code que j'écrivais.

Comment voulez-vous écrire une classe de chaîne en C / C ++ qui a une petite mémoire tampon pour les chaînes de moins de 32 octets et pointeurs pièges de sorte qu'ils fonctionnent uniquement sur la chaîne?

Ne pas essayer de vous taquiner ou quoi que ce soit, il est juste un très bon endroit pour commencer plutôt que inline et la science du compilateur.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top