Wenn Sie in wirklich leistungskritischen Bereichen arbeiten, können Sie die Effizienz nicht nachträglich beeinträchtigen. In solchen Fällen und in Bezug auf die Wartbarkeit des Endergebnisses ist dies eine der wichtigsten Überlegungen, die bei der frühzeitigen Konzeption zu berücksichtigen sind.
Sie können keinen großen Server entwerfen und implementieren und einfach damit beginnen, einfachen, gut dokumentierten Code zu schreiben, der nur Blockierungsfunktionen für alle Elemente mit einer globalen Thread-Sperre verwendet, die das gesamte System sperrt, um jede einzelne Client-Anfrage zu verarbeiten, ohne eine zu platzieren dachte was auch immer in geteilten Zustand, Fadenkonflikt und Asynchronität. Dies ist ein Rezept für eine Katastrophe und das Erfordernis, den Großteil des gut dokumentierten Codes, den Sie geschrieben haben, so umzugestalten und neu zu schreiben, dass er zu einer Codebasis führt, die nur schwer zu warten ist im nachhinein die erforderliche Effizienz zu erreichen, anstatt im Vorfeld über effiziente, einfache und funktionierende Designs nachgedacht zu haben.
Ein 8-monatiges Game-Entwicklungsteam mit einer Engine, die mit 32 Kernen nur 2 Frames pro Sekunde auf der leistungsstärksten Hardware laufen lässt und dazu neigt, jedes Mal, wenn der Bildschirm voll ist, für 15 Sekunden stehen zu bleiben, wird wahrscheinlich nicht sofort ein brauchbares Produkt erhalten Behebung eines kleinen lokalisierten Hotspots. Wahrscheinlich ist ihr Design FUBAR in einer Weise, die eine epische Überarbeitung des Zeichenbretts und Designänderungen, die in jede Ecke der Codebasis kaskadieren könnten, rechtfertigt.
Mit John Carmack sprach er einmal darüber, wie eine Tech-Demo mit mindestens Hunderten bis Tausenden von Bildern pro Sekunde ausgeführt werden muss, um sie in die Produktion zu integrieren. Das ist keine ungesunde Besessenheit von Effizienz. Er weiß im Voraus, dass Spiele in ihrer Gesamtheit über 30 FPS laufen müssen, damit die Kunden sie für akzeptabel halten. Infolgedessen kann ein kleiner Aspekt wie ein Soft Shadow-System nicht mit 30 FPS ausgeführt werden, oder das Spiel als Ganzes kann möglicherweise nicht schnell genug sein, um das erforderliche Echtzeit-Feedback zu liefern. Es ist unbrauchbar, bis es die erforderliche Effizienz erreicht. In solchen leistungskritischen Bereichen, in denen grundlegende Anforderungen an die Effizienz gestellt werden, ist eine Lösung, die keine ausreichende Geschwindigkeit erreicht, nicht besser als eine, die überhaupt nicht funktioniert.. Und Sie können kein effizientes Soft-Shadow-System entwerfen, das mit Hunderten bis Tausenden von Frames pro Sekunde läuft, wie es für eine Echtzeit-Game-Engine erforderlich ist, es sei denn, Sie haben vorher über die Effizienz nachgedacht. Tatsächlich sind in solchen Fällen 90% der Arbeit auf Effizienz ausgerichtet, da es trivial ist, ein weiches Schattensystem zu entwickeln, das bei Verwendung der Pfadverfolgung bei 2 Stunden pro Frame einwandfrei funktioniert. Sie können jedoch nicht damit rechnen, es zu optimieren mit Hunderten von Bildern pro Sekunde ohne eine völlig andere Änderung in der Herangehensweise zu laufen.
Wenn Effizienz ein wesentlicher Bestandteil des Entwurfs einer Anwendung ist, können Sie im Nachhinein keine Effizienz erwarten, ohne wesentlich mehr Zeit zu verlieren, als Sie durch Ignorieren gespart haben, da Sie im Nachhinein keine funktionierende Konstruktion erwarten können. Niemand sagt: "Es ist in Ordnung, sich erst später Gedanken über das Design zu machen. Dokumentieren Sie einfach Ihren Code gut und Sie können sich später ein passendes Design einfallen lassen ." In leistungskritischen Architekturen ist dies jedoch genau das, was Sie effektiv tun, wenn Sie im Vorfeld nicht viel Sorgfalt und Bedacht auf effiziente Entwürfe verwenden.
Das bedeutet nicht, dass Sie Ihre Implementierungen von Anfang an optimieren müssen. Für Implementierungsdetails gibt es viel Spielraum, um nach der Messung schnellere Lösungen zu finden, vorausgesetzt, das Design muss nicht geändert werden. Oft ist dies die produktivste Methode. Auf der Designebene bedeutet dies jedoch, dass Sie von Anfang an ausreichend darüber nachdenken müssen, wie sich Design und Architektur auf die Effizienz auswirken.
Der entscheidende Unterschied ist hier das Design. Es ist im Nachhinein nicht einfach, große Änderungen an Konstruktionen vorzunehmen, da sich Abhängigkeiten bei Konstruktionen ansammeln und die Abhängigkeiten sich auflösen, wenn sich die Konstruktion ändert. Und wenn für ein Design die Anforderung besteht, dass es einigermaßen effizient ist oder in einigen Fällen, dass seine Qualität weitgehend an seiner Effizienz gemessen wird, sollten Sie nicht erwarten, dass Sie im Nachhinein in der Lage sind, ein ordnungsgemäßes Design zu erzielen. Bei allen Wettbewerbsprodukten, bei denen Effizienz ein wichtiger Qualitätsaspekt ist, egal ob es sich um Betriebssysteme, Compiler, Videoprozessoren, Raytracer, Game Engines oder Physics Engines handelt, wurde von Anfang an akribisch über Effizienzgedanken und Datenrepräsentationen nachgedacht. Und in diesen Fällen ist es keine vorzeitige Optimierung, sich vorab so viele Gedanken über die Effizienz zu machen. Es war genau an der produktivsten Zeit, solche Gedanken zu platzieren, um es zu tun,