"Worth it" a besoin d'un contexte, comme la simplicité d'écriture, de lecture et de maintenance par rapport à la rapidité avec laquelle il rend quelque chose nettement plus réactif à l' utilisateur, plus interactif et nécessitant moins de temps d'attente.
Économiser quelques sous pour acheter une canette de soda ne me fera pas grand bien si je dois parcourir une certaine distance pour les économiser, d'autant plus que je bois rarement de soda de nos jours. Économiser quelques centimes par canette à l’achat d’un million de canettes de sodas pourrait être une grosse affaire.
En attendant, économiser quelques centimes quand deux personnes sont à côté de moi et que l'une offre exactement la même chose pour quelques centimes moins cher et l'autre pas, et j'ai choisi la plus chère parce que j'aime mieux que leur chapeau ressemble à un cas insensé de pessimisation.
Ce que je trouve souvent chez les gens qui appellent "micro-optimisations" semble être curieusement dépourvu de mesures, de contexte et de discussions entre utilisateurs, alors qu'il devrait être impératif que tous les trois envisagent de telles optimisations si elles ne sont pas faciles à appliquer. Pour moi, une micro-optimisation appropriée de nos jours concerne des choses telles que la disposition de la mémoire et les modèles d'accès, et bien qu'elles puissent sembler "micro" focalisées, elles ne le sont pas.
Il n’ya pas si longtemps, j’ai réussi à réduire une opération de 24 secondes à 25 millisecondes (environ 960 fois plus rapide), avec des sorties identiques (sécurisées par des tests automatisés), sans modification de la complexité algorithmique, pour le skinning par diffusion de chaleur volumétrique, à travers des "micro-optimisations" (dont la plus importante a été causée par une modification de la structure de la mémoire qui a réduit le délai à environ 2 secondes, puis les autres tâches ont consisté à SIMD, à une analyse plus poussée des erreurs de cache dans VTune et à un réaménagement de la disposition de la mémoire).
Wolfire explique la technique ici, et il a lutté avec le temps requis:
http://blog.wolfire.com/2009/11/volumetric-heat-diffusion-skinning/
Mon implémentation a réussi à être capable de le faire en millisecondes alors qu'il luttait pour le réduire à moins d'une minute:
Après avoir «optimisé micro» le temps passé de 24 secondes à 25 ms, cela a changé la donne en termes de flux de travail. Désormais, les artistes peuvent changer de plate-forme en temps réel à plus de 30 images par seconde sans attendre 24 secondes à chaque fois qu’ils modifient légèrement leur plate-forme. Et cela a en fait changé la conception de mon logiciel puisque je n'avais plus besoin de barre de progression et que des choses de ce genre étaient devenues interactives. Donc, cela pourrait être une "micro-optimisation" dans le sens où toutes les améliorations ont été apportées sans aucune amélioration de la complexité algorithmique, mais c'était plutôt une "méga-optimisation" qui a rendu ce qui était auparavant un processus douloureux et non interactif en temps réel et interactif, ce qui a complètement changé le mode de travail des utilisateurs.
Mesure, besoins de l'utilisateur, contexte
J'ai vraiment aimé le commentaire de Robert ici et peut-être que j'ai échoué à faire le point que je voulais:
Eh bien, allez. Personne ne dira que ce genre de changement n'en vaut pas la peine. Vous avez pu démontrer un avantage tangible; beaucoup de micro-optimisations ne peuvent pas.
C’est, même si je travaille dans un domaine très critique en termes de performances avec des exigences souvent en temps réel, le seul moment où je considère toute micro-optimisation qui nécessite de sortir de mon chemin.
Et j'insisterais non seulement sur les mesures, mais sur le côté utilisateur. Je suis curieux de savoir que je suis arrivé dans mon domaine actuel (et anciennement gamedev) en tant qu'utilisateur / fan, puis développeur. Je n’ai donc jamais été aussi enthousiasmé par les choses habituelles qui excitent les programmeurs comme résoudre des énigmes techniques; Je les ai trouvés un fardeau, mais je les supporterais à travers le rêve utilisateur que je partageais avec d'autres utilisateurs. Mais cela m'a aidé à m'assurer que si j'optimisais quelque chose, cela aurait un impact réel sur les utilisateurs avec des avantages réels. C'est ma protection contre la micro-optimisation sans but.
C’est aussi important que le profileur à mon avis, car j’avais des collègues qui micro-optimisent la subdivision d’un cube en un milliard de facettes uniquement pour s’étouffer avec des modèles de production réels tels que des personnages et des véhicules. Leur résultat était impressionnant au sens de "démo technologique", mais presque inutile pour les utilisateurs réels, car ils profilaient, mesuraient et comparaient les cas qui ne correspondaient pas aux cas d'utilisation réels. Il est donc primordial de comprendre en premier lieu ce qui est important pour les utilisateurs, soit en apprenant à penser et à utiliser le logiciel comme un logiciel, soit en collaborant avec eux (idéalement, les deux, au moins, en leur collaborant).