7

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?

+2

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 –

+0

Question très intéressante. Essayez de lire http://en.wikipedia.org/wiki/Compiler_optimization –

+0

@Armen: désolé si ma question était ennuyante, c'était juste par curiosité et nulle part sur le net. –

Répondre

9

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.

+0

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. –

+0

@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

+0

@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. –

5

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/

+1

Chose drôle, vous devriez vous soucier de ces choses de bas niveau et encore écrire row ++ au lieu de ++ row: P –

+4

Qu'est-ce que votre exemple de code a à voir avec l'accès au disque? – JeremyWeir

+4

é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. –

-3

Les règles d'optimisation:

  1. ne pas le faire
  2. 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.

+2

La question ne concerne pas l'optimisation manuelle, mais ce que les compilateurs peuvent faire et comment ils le font il. – DerKuchen

+0

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. –

+0

@DerKuchen: Eh bien, c'est à propos de ces deux choses. –