"Wert es" braucht Kontext, wie viel einfacher es ist, zu schreiben und zu lesen und zu pflegen, im Vergleich dazu, wie viel schneller es dem Benutzer etwas deutlich reaktionsfähiger macht , interaktiv, und weniger Zeit für das Warten benötigt.
Ein paar Pfennige zu sparen, um eine Dose Soda zu kaufen, nützt mir nicht viel, wenn ich eine Strecke zurücklegen muss, um diese Pfennige zu sparen, zumal ich heutzutage selten Soda trinke. Ein paar Cent pro Dose bei einem Einkauf von einer Million Dosen Limonaden zu sparen, könnte ein riesiges Geschäft sein.
In der Zwischenzeit spart man ein paar Cent, wenn zwei Leute direkt neben mir sind und einer genau dasselbe für ein paar Cent billiger anbietet und der andere nicht, und ich wähle den teureren, weil mir der Hut besser gefällt, wie ein dummer Fall der Pessimisierung.
Was ich oft als "Mikrooptimierungen" bezeichne, scheint merkwürdigerweise frei von Messungen, Kontext und Benutzerdiskussion zu sein, wenn es absolut alle drei gibt, die solche Optimierungen in Betracht ziehen, wenn sie nicht einfach anzuwenden sind. Für mich bezieht sich eine richtige Mikrooptimierung heutzutage auf Dinge wie Speicherlayouts und Zugriffsmuster, und obwohl sie im Fokus "Mikro" zu sein scheinen, sind sie in ihrer Wirkung nicht Mikro.
Es ist mir vor nicht allzu langer Zeit gelungen, eine Operation von 24 Sekunden auf 25 Millisekunden (etwa 960-mal schneller) mit identischen Ausgaben (gesichert durch automatisierte Tests) zu reduzieren, ohne die algorithmische Komplexität für die volumetrische Wärmediffusionshautbildung zu ändern "Mikrooptimierungen" (die größten resultierten aus einer Änderung des Speicherlayouts, die auf ungefähr 2 Sekunden zurückging, der Rest waren Dinge wie SIMD und die weitere Analyse von Cache-Fehlern in VTune und eine weitere Neuordnung des Speicherlayouts).
Wolfire erklärt die Technik hier und kämpfte mit der erforderlichen Zeit:
http://blog.wolfire.com/2009/11/volumetric-heat-diffusion-skinning/
Meine Implementierung hat es geschafft, dies in Millisekunden zu tun, während er sich bemühte, es auf weniger als eine Minute zu reduzieren:
Nachdem ich es von 24 Sekunden auf 25 Millisekunden "mikrooptimiert" hatte, war das ein Grundstein für den Workflow. Jetzt können Künstler ihre Rigs in Echtzeit mit über 30 FPS wechseln, ohne jedes Mal 24 Sekunden warten zu müssen, wenn sie kleine Änderungen an ihrem Rig vornehmen. Und das hat tatsächlich das gesamte Design meiner Software verändert, da ich keine Fortschrittsanzeige und solche Dinge mehr benötigte. Es wurde einfach alles interaktiv. Das mag also eine "Mikrooptimierung" in dem Sinne sein, dass alle Verbesserungen ohne eine Verbesserung der algorithmischen Komplexität erfolgten, aber es war eine eher "Megaoptimierung" in der Wirkung, die einen ehemals schmerzhaften, nicht interaktiven Prozess ausmachte in eine interaktive Echtzeitumgebung, die die Arbeitsweise der Benutzer grundlegend verändert hat.
Messung, Benutzeranforderungen, Kontext
Ich mochte Roberts Kommentar hier wirklich und habe vielleicht nicht den Punkt gemacht, den ich wollte:
Na komm schon. Niemand wird argumentieren, dass diese Art der Veränderung nicht "wert" ist. Sie konnten einen greifbaren Nutzen nachweisen; Viele sogenannte Mikrooptimierungen können das nicht.
Dies ist, trotz der Arbeit in einem sehr leistungskritischen Bereich mit häufig Echtzeitanforderungen, das einzige Mal, dass ich eine Mikrooptimierung in Betracht ziehe, die es erforderlich macht, mir aus dem Weg zu gehen.
Und ich möchte nicht nur die Messungen betonen, sondern auch die benutzerseitige Seite. Ich bin insofern ein Kuriosum, als ich zuerst als Benutzer / Fan, dann als Entwickler zu meinem derzeitigen Fach (und früher zu Gamedev) kam. Daher war ich nie so begeistert von den üblichen Dingen, die Programmierer zum Lösen technischer Rätsel anregen. Ich fand sie eine Last, würde sie aber durch den Benutzer-End-Traum tragen, den ich mit anderen Benutzern teilte. Aber das hat mir geholfen, um sicherzustellen, dass ich, wenn ich etwas optimiere, einen echten Einfluss auf die Benutzer mit echten Vorteilen habe. Es ist mein Schutz vor zielloser Mikrooptimierung.
Das ist meiner Meinung nach genauso wichtig wie der Profiler, weil ich Kollegen hatte, die Dinge wie die mikrooptimierte Unterteilung eines Würfels in eine Milliarde Facetten taten, um sich nur an realen Produktionsmodellen wie Charakteren und Fahrzeugen zu verschlucken. Ihr Ergebnis war in gewissem Sinne beeindruckend, aber für die tatsächlichen Benutzer nahezu nutzlos, da sie Profile erstellten und Fälle maßen und vergleichten, die nicht mit tatsächlichen Anwendungsfällen übereinstimmten. Deshalb ist es so wichtig zu verstehen, worauf es den Benutzern ankommt, indem sie lernen, die Software wie eine zu denken und zu verwenden oder mit ihnen zusammenzuarbeiten (im Idealfall beides, aber zumindest mit ihnen zusammenzuarbeiten).