J'ai souvent vu cette citation utilisée pour justifier un code ou un code manifestement mauvais qui, même si ses performances n'ont pas été mesurées, pourrait probablement être rendu plus rapide, sans augmenter la taille du code ni en compromettre la lisibilité.
En général, je pense que les premières micro-optimisations peuvent être une mauvaise idée. Cependant, les macro-optimisations (telles que le choix d’un algorithme O (log N) au lieu de O (N ^ 2)) sont souvent utiles et devraient être effectuées tôt, car il peut être inutile d’écrire un algorithme O (N ^ 2) et puis le jeter complètement en faveur d'une approche O (log N).
Notez que les mots peuvent être : si l’algorithme O (N ^ 2) est simple et facile à écrire, vous pouvez le jeter plus tard sans trop de culpabilité s’il s’avère trop lent. Toutefois, si les deux algorithmes sont aussi complexes ou si la charge de travail attendue est si importante que vous savez déjà que vous aurez besoin du plus rapide, l'optimisation anticipée est une bonne décision d'ingénierie qui réduira à terme votre charge de travail totale.
Ainsi, en général, je pense que la bonne approche consiste à déterminer quelles sont vos options avant de commencer à écrire du code et à choisir consciemment le meilleur algorithme pour votre situation. Plus important encore, l'expression "l'optimisation prématurée est la racine de tout le mal" n'est pas une excuse pour l'ignorance. Les promoteurs de carrière devraient avoir une idée générale du coût des opérations courantes; ils devraient savoir, par exemple,
- que les chaînes coûtent plus cher que les chiffres
- les langages dynamiques sont beaucoup plus lents que les langages statiques
- les avantages des listes matricielles / vectorielles par rapport aux listes chaînées, et inversement
- quand utiliser une hashtable, quand utiliser une carte triée et quand utiliser un tas
- que (s'ils fonctionnent avec des appareils mobiles) "double" et "int" ont des performances similaires sur les ordinateurs de bureau (la PF peut même être plus rapide) mais "double" peut être cent fois plus lent sur des appareils mobiles bas de gamme sans FPU;
- que le transfert de données sur Internet est plus lent que l’accès au disque dur, que les disques durs sont beaucoup plus lents que la RAM, beaucoup plus lents que le cache et les registres L1 et que les opérations Internet peuvent se bloquer indéfiniment (et échouer à tout moment).
Et les développeurs doivent être familiarisés avec une boîte à outils de structures de données et d'algorithmes afin de pouvoir facilement utiliser les bons outils pour le travail.
Avoir beaucoup de connaissances et une boîte à outils personnelle vous permet d’optimiser presque sans effort. Il est diabolique de consacrer beaucoup d’efforts à une optimisation qui pourrait ne pas être inutile (et j’admets avoir été pris au piège plus d’une fois). Mais lorsque l'optimisation est aussi simple que de choisir un ensemble / hashtable au lieu d'un tableau ou de stocker une liste de nombres dans double [] au lieu de string [], pourquoi pas? Je ne suis peut-être pas d'accord avec Knuth mais je pense qu'il parlait de l'optimisation de bas niveau alors que je parle de l'optimisation de haut niveau.
N'oubliez pas que cette citation date de 1974. En 1974, les ordinateurs étaient lents et la puissance de calcul coûteuse, ce qui donnait à certains développeurs une tendance à l'optimisation excessive, ligne par ligne. Je pense que c'est ce que Knuth a poussé. Il ne disait pas "ne t'inquiète pas du tout pour la performance", car en 1974, ce ne serait que des paroles folles. Knuth expliquait comment optimiser; En bref, il convient de se concentrer uniquement sur les goulots d'étranglement et avant de le faire, vous devez effectuer des mesures pour trouver les goulots d'étranglement.
Notez que vous ne pouvez pas trouver les goulots d'étranglement avant d'avoir écrit un programme à mesurer, ce qui signifie que certaines décisions de performance doivent être prises avant que quoi que ce soit n'existe à mesurer. Parfois, ces décisions sont difficiles à changer si vous vous trompez. Pour cette raison, il est bon d’avoir une idée générale du coût de la chose afin de pouvoir prendre des décisions raisonnables en l’absence de données fiables.
L'optimisation et le degré d'inquiétude lié aux performances dépendent du travail à effectuer. Lorsque vous écrivez des scripts que vous n'exécuterez que quelques fois, vous soucier de la performance est généralement une perte de temps totale. Mais si vous travaillez pour Microsoft ou Oracle et que vous travaillez sur une bibliothèque que des milliers d'autres développeurs vont utiliser de mille façons différentes, il peut être rentable de l'optimiser, de façon à pouvoir couvrir tous les aspects divers. utiliser les cas efficacement. Même dans ce cas, le besoin de performance doit toujours être mis en balance avec le besoin de lisibilité, de maintenabilité, d’élégance, d’extensibilité, etc.