Ihre Intuition kann sich mit der Zeit verbessern. Ich würde das rausschmeißen, vielleicht ein bisschen kontrovers, aber über viele Jahre mit VTune und CodeAnalyst und jetzt mit CodeXL würde ich sagen, dass ich in meinen Intuitionen viel genauer bin als vorher, wo die Hotspots zumindest sein werden Der Punkt, an dem ich nicht mehr völlig unvorbereitet bin, wenn ich Code profiliere. Das heißt nicht, dass ich versuche, Dinge blind zu optimieren.
Die Profilerstellung hat meine Abhängigkeit von Profilern erhöht, nicht verringert. Ich sage nur, ich kann leichter vorhersehen, wie die Profilerstellungsergebnisse in gewissem Maße aussehen werden, und außerdem Hotspots erfolgreich beseitigen und die Zeit verkürzen, die für den Abschluss des Benutzerendvorgangs erforderlich ist, ohne blinde Stiche im Dunkeln zu machen und zu vermissen (etwas, das Sie tun) kann dies auch tun, wenn Sie einen Profiler verwenden, bis Sie nicht nur verstehen, was die Hotspots sind, sondern auch, warum sie genau Hotspots in Bezug auf beispielsweise Cache-Fehler sind.
Erst als ich anfing, Profiler zu verwenden, begann ich, diese Intuition zu verbessern. Einer der Gründe dafür ist, dass Sie, wenn Sie mit Ihrem Code vertraut sind, möglicherweise die größten und offensichtlichsten Hotspots richtig einschätzen, aber nicht alle Feinheiten dazwischen. Natürlich, wenn Sie eine Benutzer-End-Operation haben, die eine Stunde in Anspruch nimmt und es einen lückenhaften quadratischen Komplexitätsalgorithmus gibt, der eine Eingabe mit einem Umfang von hunderttausend Elementen verarbeitet, können Sie wahrscheinlich Ihre gesamten Ersparnisse auf die Idee bringen, dass es sich um die quadratische Komplexität handelt Algorithmus hier schuld. Aber das gibt Ihnen keinen detaillierten Einblick oder lässt Sie beispielsweise genau wissen, was nicht zur Zeit beiträgt.
Es gibt so viel Wert, wenn Sie anfangen zu profilieren und zu sehen, wo all die Dinge, von denen Sie dachten, dass sie einen größeren Beitrag zur Zeit geleistet haben, nicht viel Zeit beigetragen haben. Nicht die offensichtlichen Ursachen für Ineffizienzen, sondern die, von denen Sie vermuteten, dass sie geringfügig ineffizient waren. Nach der Profilerstellung stellten Sie jedoch fest, dass sie zu keinem Zeitpunkt einen Beitrag geleistet haben. Und hier erhalten Sie möglicherweise die intuitivste Einsicht, wenn Sie feststellen, dass Sie in all den subtilen Bereichen, in denen es nicht offensichtlich ist, wie viel Zeit gerade aufgewendet wird, falsch dargestellt werden.
Die menschliche Intuition, die über die offensichtliche algorithmische Komplexität hinausgeht, beginnt häufig falsch, da die Effizienz der Maschine und die Effizienz des menschlichen Geistes sehr unterschiedlich sind. Anfangs ist es nicht so intuitiv, über Speicherhierarchien nachzudenken, die von den Registern über den CPU-Cache zum DRAM zur Festplatte gehen. Es ist nicht intuitiv zu denken, dass redundante Arithmetik möglicherweise schneller ist, als mehr Verzweigungs- oder Speicherzugriffe auf eine Nachschlagetabelle durchzuführen, um einige Verarbeitungsarbeiten zu überspringen. Wir neigen dazu, uns Gedanken darüber zu machen, wie viel Arbeit noch zu tun ist, während wir Dinge wie die Kosten für Entscheidungen und das Laden und Speichern von Speicher abrechnen. Was für die Hardware effizient ist, ist häufig in einer Weise sehr kontraintuitiv, die von Anfang an alle Ihre menschlichen Annahmen durchbricht.
Wo die Verbesserung dieser Intuition durch Profilerstellung helfen kann, ist das Interface-Design . Die Änderung des Schnittstellendesigns ist im Nachhinein sehr kostspielig. Die Kosten steigen proportional zur Anzahl der Stellen, die von dieser Schnittstelle abhängen. Wenn Sie anfangen, Ihre Intuition zu verbessern, können Sie beim ersten Mal besser mit dem Entwerfen von Benutzeroberflächen beginnen, sodass Raum für zukünftige Optimierungen bleibt, ohne kostspielige Änderungen am Design vornehmen zu müssen. Wieder ist diese Intuition etwas, das Sie im Allgemeinen entwickeln und das Sie unbegrenzt weiterentwickeln, indem Sie immer diesen Profiler zur Hand haben.