J'ai rencontré cette question quand je répondais à une autre question. Comment les compilateurs optimisent-ils le code? Est-ce que les mots-clés comme const, ... peuvent aider? A côté du fait des volatiles et des fonctions inline et comment optimiser le code tout seul!Comment les compilateurs optimisent-ils notre code?
Répondre
Les compilateurs sont libres d'optimiser le code tant qu'ils peuvent garantir que la sémantique du code n'est pas modifiée.
Je voudrais faire une suggestion à partir de la page wikipedia Compiler optimization, car il existe de nombreux types d'optimisation qui sont effectuées à plusieurs étapes différentes. Comme vous pouvez le voir, les compilateurs modernes sont très «intelligents» pour optimiser le code (le code C compilé est souvent plus rapide que l'assemblage écrit à la main, sauf si le programmeur sait vraiment tirer parti de toutes les instructions et bizarreries du processeur). Comme d'autres l'ont dit, écrivez pour plus de clarté en vous basant sur un bon design.
les compilateurs peuvent le faire s'ils savent quel matériel fonctionne leur code! Parfois, le GPU doit entrer, ils gâchent. J'ai récemment écrit un code qui utilisait à la fois cpu et gpu (cuda) et le bogue était juste cette simple optimisation O2. Quand je l'ai éteint, tout avait un sens. –
@Green Code: Les compilateurs sont aussi des logiciels, ils sont donc parfois bogués. Mais pour les compilateurs matures, la sortie est généralement correcte et flamboyante par rapport à ce que la plupart des programmeurs pourraient écrire eux-mêmes. – delnan
@Green Code: il existe différents niveaux d'optimisations. Certains sont indépendants de la machine, d'autres non. Les machines dépendantes peuvent ne pas être sans bug, en particulier pour les jeunes architectures, simplement parce qu'elles n'ont pas encore été testées. CUDA apporte aussi une nouvelle difficulté: soudainement, il y a des parties du code qui devraient être optimisées pour le CPU et d'autres pour le GPU. Aucun des compilateurs C++ que je connais n'a été conçu pour optimiser deux architectures différentes à la fois. –
Une très grande chose que vous pouvez faire (au-delà de ce que le compilateur peut faire pour vous) est d'être conscient du cache. Étant donné que l'accès à la mémoire est vraiment coûteux en temps, le cache essaie de vous aider en stockant non seulement les données auxquelles vous avez accédé mais aussi les éléments à proximité. Voilà pourquoi foo
va courir beaucoup plus vite que bar
:
array[ NUM_ROWS ][ NUM_COLS ];
foo()
{
int row, col;
int sum = 0;
// accesses the elements in the array continuously
for (row = 0; row < NUM_ROWS ; row++)
{
for (col = 0; col < NUM_COLS; col++)
{
sum += array[ row ][ col ];
}
}
}
bar()
{
int row, col;
int sum = 0;
// skips from row to row (big jumps that might miss the cache)
for (col = 0; col < NUM_COLS ; col++)
{
for (row = 0; row < NUM_ROWS; row++)
{
sum += array[ row ][ col ];
}
}
}
Edit: Une autre chose à prendre en compte est répétée concaténation de chaînes. Fait mal, cela peut rendre le code qui semble autrement fonctionner en O(n)
être réellement O(n^2)
- voir un article sur Joel on Software
Edit: s/disque/mémoire/
Chose drôle, vous devriez vous soucier de ces choses de bas niveau et encore écrire row ++ au lieu de ++ row: P –
Qu'est-ce que votre exemple de code a à voir avec l'accès au disque? – JeremyWeir
étant conscient de la mémoire cache vous permettra d'économiser beaucoup plus de ++ ligne: P @jayrdub: cela implique une explication de la façon dont la mémoire * fonctionne * dans la machine. Fondamentalement, 'array [row] [col]' est un appel à la mémoire principale qui est initialement stockée sur le disque dur. Étant donné que le disque dur se déplace beaucoup plus lentement que le processeur, les ordinateurs stockent les informations dans un «cache» où ils sont plus faciles d'accès. –
Les règles d'optimisation:
- ne pas le faire
- utilisateurs avancés: ne le faites pas encore
Editer: La citation (et d'autres informations, utiles ou non) peuvent être trouvées dans l'article CodingHorror: Hardware is cheap, programmers are expensive. Ce serait bien de trouver l'origine de cette phrase/citation.
La question ne concerne pas l'optimisation manuelle, mais ce que les compilateurs peuvent faire et comment ils le font il. – DerKuchen
Salut, Merci pour vos conseils, mais je suppose que je suis sur le point de l'apprendre complètement, donc je ne veux pas le mal comprendre. –
@DerKuchen: Eh bien, c'est à propos de ces deux choses. –
- 1. Comment protéger notre code?
- 2. Compilateurs de code dérivés
- 3. Comment pouvons-nous protéger notre code MVC2?
- 4. C++: De combien de façons le compilateur optimise notre code?
- 5. Comment fonctionnent les compilateurs de shaders?
- 6. Compilateurs pour les scripts shell
- 7. mémoire partagée entre les compilateurs?
- 8. Site inconnu utilisant notre code d'analyse
- 9. comment obtenir un badge de serveur à notre code
- 10. Inversion de contrôle dans les compilateurs
- 11. Y a-t-il des compilateurs de code natif Lisp?
- 12. Branchement aux compilateurs Java
- 13. C99 fenv.h pour les compilateurs MS
- 14. Comment les programmes/compilateurs/interprètes de clojure fonctionnent-ils réellement?
- 15. Compilateurs Ada pour Linux
- 16. Compilateurs G ++ pour MonoDevelop
- 17. Comment configurer Makefile pour utiliser différents compilateurs
- 18. C++ Séparer les compilateurs pour les classes (vtables)?
- 19. Compilateurs pour DOS32?
- 20. Cumum différents compilateurs
- 21. Autres compilateurs C++?
- 22. compilateurs AS3 à JS
- 23. Pouvons-nous modifier notre code lors de l'exécution de l'application
- 24. Compilateurs C++ et frontaux/frontaux
- 25. Fermez les autres applications multitâches avec notre application avec le code - iPhone
- 26. Rendre les compilateurs GCC et autres C++ très stricts
- 27. Ajouter Three20 dans notre projet?
- 28. Est-ce que les annotations gae datanucleus modifient notre code java?
- 29. bibliothèques de liens compilées par divers compilateurs
- 30. Comment pourrions-nous implémenter le gradient diagonal d'un PSD dans notre code CSS xhtml?
Ceci est mon deuxième jour dans stackoverflow, mais je vois déjà le sujet de l'optimisation const pour la troisième fois ... Pourquoi les programmeurs sont-ils si obsédés par l'optimisation, surtout quand cela n'est pas nécessaire? Ceci est lié à une dupe –
Question très intéressante. Essayez de lire http://en.wikipedia.org/wiki/Compiler_optimization –
@Armen: désolé si ma question était ennuyante, c'était juste par curiosité et nulle part sur le net. –