Optimisation prématurée et pessimisation prématurée liée aux normes de codage C ++

Les normes de codage C ++ de Herb Sutter indiquent qu’il faut éviter l’ Premature optimization Premature pessimization et la Premature pessimization . Mais je sens que les deux font la même chose. Nous attendons donc de l’aide pour clarifier ces deux concepts, les différents étant parmi eux. Si vous proposez quelques exemples, ce sera plus avantageux pour les autres. Voici une bonne explication sur l’ Premature optimization . Mais je n’ai pas pu en trouver pour la Premature pessimization

Je pense que ce qu’il entend par «pessimisation prématurée» est tout le contraire de l’optimisation prématurée: un mépris fondamental des structures de données et des algorithmes à utiliser.

L’optimisation prématurée concerne souvent des détails minutieux d’algorithmes qui peuvent être peaufinés plus tard et auxquels il n’est pas nécessaire de faire attention au début.

La pessimisation prématurée, en revanche, concerne la conception de haut niveau de l’architecture de code: une interface fondamentalement inefficace pour votre bibliothèque, par exemple, ne peut pas être corrigée ultérieurement par optimisation, car l’interface publique est pratiquement gravée dans le marbre.

Ce que signifie Herb, c’est que lorsque vous devez faire face à deux options qui se lisent également, choisissez toujours la plus efficace.

Utiliser std::vector::reserve() ou le meilleur conteneur ou algorithme standard n’est pas une optimisation prématurée. Cependant, ne pas les utiliser serait une pessimisation prématurée .

L’optimisation prématurée consiste à sacrifier la lisibilité au profit d’une “optimisation” qui pourrait même ne pas en valoir la peine. Utilisez un profileur pour cela.

Il y a des choix à petite et à grande échelle à faire lors de la programmation.

La pessimisation consiste à écrire du code d’une manière qui “empêche le compilateur de faire du bon travail”. Un exemple typique serait de ne pas placer les fonctions dans un endroit leur permettant d’être en ligne, lorsque la fonction est VRAIMENT petite et simple (a {s, g} etter par exemple). Cela peut faire que la fonction prenne 10 fois plus de temps qu’elle devrait être, et c’est une chose tellement simple de «bien faire les choses».

Une pessimisation que j’ai trouvée à quelques resockets sur ce site consiste à utiliser “a / = 2;” quand “a >> = 1” est également approprié. Si nous soaps que a n’est pas négatif, le décalage gauche et la division ont le même effet, mais même lorsque le compilateur optimise la division, il produit presque toujours plus de code pour faire face à la situation “cela peut être négatif” – et ce code supplémentaire peut être un véritable succès dans certains cas.

L’optimisation prématurée consiste à dérouler des boucles ou à compliquer le code simplement parce que vous ne faites pas confiance au compilateur pour faire un bon travail – généralement sans aucune preuve qu’il ne fera pas un bon travail.

Un autre exemple serait “ne pas utiliser std::vector “, mais votre propre expandable array car “vector is too slow”, sans même avoir testé le code avec std::vector .

J’aurais tendance à penser que la pessimisation prématurée est simplement une interprétation erronée des exigences de performance qui conduit à une opimisation prématurée. c’est-à-dire que vous supposez à tort que votre code ne fonctionnera pas assez rapidement ou que vous utiliserez trop de ressources (pessimisme), vous optimisez donc là où ce n’est pas nécessaire.

Avec l’arrivée de plus en plus d’énormes jeux de données, j’ai tendance à inverser la tendance plus souvent, c’est-à-dire à un manque de pessimisme suffisant menant à la sélection d’algorithmes qui ne seront pas adaptés aux besoins des utilisateurs. Ceci est souvent associé à la conviction que l’optimisation du compilateur est une sorte de substitut à une mauvaise sélection d’algorithme.