Votre intuition peut s'améliorer avec le temps. Je jetterais cela, peut-être un peu controversé, mais au cours de nombreuses années d'utilisation de VTune et CodeAnalyst et maintenant de CodeXL, je dirais que je suis beaucoup plus précis dans mes intuitions qu'auparavant quant à l'emplacement des points d'accès, au moins pour le point où je ne suis plus complètement pris au dépourvu lorsque je profile un code. Cela ne signifie pas que j'essaie d'optimiser les choses à l'aveuglette.
Le profilage a en fait accru ma dépendance vis-à-vis des profileurs, et non diminué. Je dis simplement que je peux plus facilement anticiper les résultats du profilage dans une certaine mesure et, en outre, éliminer avec succès les points chauds et améliorer le temps nécessaire pour terminer l'opération utilisateur sans prendre de coups aveugles dans le noir et manquant (quelque chose que vous peut faire même lorsque vous utilisez un profileur jusqu'à ce que vous commenciez à comprendre non seulement ce que sont les hotspots, mais pourquoi ils sont exactement des hotspots en ce qui concerne, disons, les échecs de cache).
Cependant, ce n'est que lorsque j'ai commencé à utiliser des profileurs que j'ai commencé à améliorer cette intuition. L'une des raisons est que si vous connaissez bien votre code, vos intuitions peuvent être correctes par rapport aux points d'accès les plus importants et les plus évidents, mais pas toutes les subtilités entre les deux. Naturellement, si vous avez une opération utilisateur qui prend une heure et qu'il existe un algorithme de complexité quadratique béant traitant une entrée couvrant cent mille éléments, vous pouvez probablement sortir riche en jouant toutes vos économies sur l'idée que c'est la complexité quadratique algorithme en faute ici. Mais cela ne vous donne aucun aperçu détaillé ou, par exemple, vous permet de savoir exactement ce qui ne contribue pas au temps.
Il y a tellement de valeur à avoir lorsque vous commencez à créer des profils et à voir où toutes les choses que vous pensiez avoir été un plus grand contributeur de temps ne contribuaient pas beaucoup de temps; pas les sources évidentes béantes d'inefficacités mais celles que vous soupçonniez auraient pu être légèrement inefficaces mais, après profilage, réalisant qu'elles ont à peine contribué à tout moment. Et c'est potentiellement là où vous obtenez le plus intuitif que vous vous trompez dans tous ces domaines subtils où il n'est pas évident de savoir combien de temps vous passez.
L'intuition humaine au-delà de la complexité algorithmique évidente commencera souvent incorrectement parce que ce qui est efficace pour la machine et ce qui est efficace pour l'esprit humain sont très différents. Il ne vient pas si intuitivement au début de penser aux hiérarchies de mémoire allant des registres au cache CPU à la DRAM au disque. Il ne vient pas intuitivement de penser que l'arithmétique redondante peut être plus rapide que de faire plus de branchements ou d'accès à la mémoire d'une table de recherche pour ignorer certains travaux de traitement. Nous avons tendance à penser en termes de travail à faire tout en actualisant des choses comme le coût de la prise de décisions et les charges de mémoire et les magasins. Ce qui est efficace pour le matériel est souvent très contre-intuitif de manière à briser toutes vos hypothèses humaines au départ,
Là où l'amélioration de cette intuition peut aider, grâce au profilage, c'est la conception d'interface . Les conceptions d'interface sont très coûteuses à changer avec le recul, les coûts augmentant proportionnellement au nombre de places en fonction de cette interface. Lorsque vous commencez à améliorer votre intuition, vous pouvez commencer à concevoir des interfaces mieux la première fois de manière à laisser une marge de manœuvre pour une optimisation future sans modifications de conception coûteuses. Encore une fois cependant, cette intuition est quelque chose que vous développez généralement, et continuez à développer indéfiniment, en ayant toujours ce profileur en main.