Ich habe oft gesehen, dass dieses Zitat verwendet wurde, um offensichtlich schlechten Code oder Code zu rechtfertigen, der, obwohl seine Leistung nicht gemessen wurde, wahrscheinlich recht einfach schneller gemacht werden könnte, ohne die Codegröße zu erhöhen oder seine Lesbarkeit zu beeinträchtigen.
Im Allgemeinen halte ich frühe Mikrooptimierungen für eine schlechte Idee. Makrooptimierungen (z. B. die Auswahl eines O (log N) -Algorithmus anstelle von O (N ^ 2)) sind jedoch häufig sinnvoll und sollten frühzeitig durchgeführt werden, da es möglicherweise verschwenderisch ist, einen O (N ^ 2) -Algorithmus zu schreiben und Werfen Sie es dann vollständig weg, und verwenden Sie die Methode O (log N).
Beachten Sie, dass die Wörter sein können : Wenn der O (N ^ 2) -Algorithmus einfach und leicht zu schreiben ist, können Sie ihn später ohne viel Schuldgefühl wegwerfen, wenn er sich als zu langsam herausstellt. Wenn jedoch beide Algorithmen ähnlich komplex sind oder wenn die erwartete Arbeitslast so hoch ist, dass Sie bereits wissen, dass Sie die schnellere benötigen, ist eine frühzeitige Optimierung eine fundierte technische Entscheidung, die Ihre gesamte Arbeitslast auf lange Sicht reduziert.
Daher denke ich im Allgemeinen, dass der richtige Ansatz darin besteht, herauszufinden, welche Optionen Sie haben, bevor Sie mit dem Schreiben von Code beginnen, und den besten Algorithmus für Ihre Situation zu wählen. Am wichtigsten ist jedoch, dass der Ausdruck "vorzeitige Optimierung ist die Wurzel allen Übels" keine Entschuldigung für Unwissenheit ist. Karriereentwickler sollten eine allgemeine Vorstellung davon haben, wie hoch die allgemeinen Betriebskosten sind. sie sollten zum Beispiel wissen,
- Saiten kosten mehr als Zahlen
- dass dynamische Sprachen viel langsamer sind als statisch typisierte Sprachen
- die Vorteile von Array- / Vektorlisten gegenüber verknüpften Listen und umgekehrt
- wann eine Hashtabelle verwendet werden soll, wann eine sortierte Karte verwendet werden soll und wann ein Heap verwendet werden soll
- dass (wenn sie mit mobilen Geräten arbeiten) "double" und "int" auf Desktops eine ähnliche Leistung haben (FP kann sogar schneller sein), aber "double" auf mobilen Low-End-Geräten ohne FPUs hundertmal langsamer sein kann;
- Das Übertragen von Daten über das Internet ist langsamer als der Festplattenzugriff, Festplatten sind erheblich langsamer als RAM, RAM ist viel langsamer als der L1-Cache und die Register, und Internetvorgänge können auf unbestimmte Zeit blockiert werden (und jederzeit fehlschlagen).
Entwickler sollten mit einer Toolbox von Datenstrukturen und Algorithmen vertraut sein, damit sie problemlos die richtigen Tools für den Job verwenden können.
Mit viel Wissen und einer persönlichen Toolbox können Sie nahezu mühelos optimieren. Es ist böse, viel Mühe in eine Optimierung zu stecken, die möglicherweise unnötig ist (und ich gebe zu, mehr als einmal in diese Falle zu tappen). Aber wenn die Optimierung so einfach ist wie das Auswählen einer Menge / einer Hashtabelle anstelle eines Arrays oder das Speichern einer Liste von Zahlen in double [] anstelle von string [], warum dann nicht? Ich bin mir nicht sicher, ob ich hier mit Knuth nicht einverstanden bin, aber ich glaube, er hat von Low-Level-Optimierung gesprochen, während ich von High-Level-Optimierung spreche.
Denken Sie daran, dass dieses Zitat ursprünglich aus dem Jahr 1974 stammt. Im Jahr 1974 waren Computer langsam und die Rechenleistung teuer, was einigen Entwicklern die Tendenz gab, Zeile für Zeile zu optimieren. Ich glaube, Knuth hat sich dagegen gewehrt. Er sagte nicht "mach dir überhaupt keine Sorgen um die Leistung", denn 1974 wäre das nur verrücktes Gerede. Knuth erklärte, wie man optimiert; Kurz gesagt, man sollte sich nur auf die Engpässe konzentrieren, und bevor Sie dies tun, müssen Sie Messungen durchführen, um die Engpässe zu finden.
Beachten Sie, dass Sie die Engpässe erst finden können, wenn Sie ein zu messendes Programm geschrieben haben. Dies bedeutet, dass einige Leistungsentscheidungen getroffen werden müssen , bevor etwas zu messen ist. Manchmal ist es schwierig, diese Entscheidungen zu ändern, wenn Sie sie falsch verstehen. Aus diesem Grund ist es gut, eine allgemeine Vorstellung davon zu haben, was Dinge kosten, damit Sie vernünftige Entscheidungen treffen können, wenn keine festen Daten verfügbar sind.
Wie früh die Optimierung beginnt und inwieweit Sie sich um die Leistung sorgen müssen, hängt vom jeweiligen Job ab. Wenn Sie Skripte schreiben, die Sie nur ein paar Mal ausführen, ist es in der Regel reine Zeitverschwendung, sich Gedanken über die Leistung zu machen. Wenn Sie jedoch für Microsoft oder Oracle arbeiten und an einer Bibliothek arbeiten, die Tausende anderer Entwickler auf tausende verschiedene Arten verwenden werden, lohnt es sich möglicherweise, sie zu optimieren, damit Sie die gesamte Bandbreite abdecken können Use Cases effizient nutzen. Trotzdem muss das Leistungsbedürfnis immer gegen das Bedürfnis nach Lesbarkeit, Wartbarkeit, Eleganz, Erweiterbarkeit usw. abgewogen werden.