Dem Textbuch folgend, vermesse ich Leistung, wenn ich versuche, meinen Code zu optimieren. Manchmal ist der Leistungsgewinn jedoch eher gering und ich kann nicht entscheidend entscheiden, ob ich diese Optimierung implementieren soll.
Wenn ein Fix beispielsweise unter bestimmten Bedingungen eine durchschnittliche Antwortzeit von 100 ms bis 90 ms verkürzt, sollte ich diesen Fix implementieren? Was ist, wenn es 200ms auf 190ms verkürzt? Wie viele Bedingungen sollte ich versuchen, bevor ich daraus schließen kann, dass es insgesamt vorteilhaft sein wird?
Ich denke, es ist nicht möglich, eine direkte Antwort darauf zu geben, da es von zu vielen Dingen abhängt, aber gibt es eine gute Faustregel, der ich folgen sollte? Gibt es Richtlinien / Best Practices?
EDIT: Danke für die tollen Antworten! Ich denke, die Moral der Geschichte ist, es gibt keinen einfachen Weg zu sagen, ob du solltest, aber es gibt Richtlinien, die diesen Prozess unterstützen können. Dinge, die du beachten solltest, Dinge, die du nicht tun solltest usw. Diese besondere Zeit endete Implementieren des Updates, obwohl es einige Codezeilen in 20-30 Zeilen Code erstellt. Weil unsere App. ist sehr leistungskritisch, und es war ein konsequenter Gewinn von 10% in verschiedenen realistischen Fällen.
Ich denke, die Faustregel (zumindest für mich) ist zweifach:
Zu Punkt 1 oben: Wenn Sie vorschlagen, dass ein Endnutzer Ihrer Software einen Unterschied von 10 ms "bemerkt", möchte ich nicht vorschlagen, dass sie tatsächlich einen Unterschied sehen werden. Wenn Ihre App jedoch auf einem Server mit Millionen von Verbindungen ausgeführt wird und jede kleine Geschwindigkeitssteigerung den Server erheblich entlastet, kann dies für den Client, auf dem der Server ausgeführt wird, von Bedeutung sein. Oder wenn Ihre App extrem zeitkritische Arbeit leistet, ist dies ein weiterer Fall, in dem das Ergebnis einer 10ms-Beschleunigung wahrnehmbar ist, auch wenn die Beschleunigung selbst nicht ist / p>
Der einzig vernünftige Ansatz für Ihre Frage ist etwas wie "wenn der Nutzen groß genug ist, um die Zeit zu rechtfertigen, die Sie investieren, um die Optimierung zu erforschen, zu implementieren und zu testen."
Der "Nutzen ist groß genug" ist äußerst subjektiv. Können Sie oder Ihr Arbeitgeber mehr Softwareeinheiten verkaufen, wenn Sie diese Änderung vornehmen? Wird Ihre Benutzerbasis benachrichtigt? Wird es Ihnen persönliche Befriedigung geben, den schnellstmöglichen Code zu haben? Welche dieser oder ähnlicher Fragen gelten, ist etwas, das nur Sie kennen können.
Im Großen und Ganzen war die meiste Software, die ich geschrieben habe (in einer mehr als 20-jährigen Karriere), "schnell genug" out of the box und der Code, den ich optimieren wollte, stellte sich als offensichtlicher Engpass für die Endnutzer heraus : Abfragen dauern lange, scrollen zu langsam, so etwas.
Donald Knuth machte die folgenden zwei Aussagen zur Optimierung:
"Wir sollten klein vergessen Effizienz, sagen etwa 97% der Zeit: vorzeitige Optimierung ist die Wurzel allen Übels "[2]
und
"In etabliertem Engineering Disziplinen eine 12% Verbesserung, leicht erhalten, wird nie als marginal angesehen und ich glaube denselben Standpunkt sollte in Software vorherrschen Technik "[5]
src: Ссылка
Sie sollten die Optimierungsbemühungen auf die Teile des Codes konzentrieren, die die meiste Laufzeit ausmachen. Wenn ein bestimmter Codeabschnitt 80% der Gesamtlaufzeit ausmacht, hat die Optimierung um 5% weniger Zeitverlust als die Reduzierung des restlichen Codes um 20%.
Im Allgemeinen machen Optimierungen den Code weniger lesbar (nicht immer, aber oft). Daher sollten Sie die Optimierung so lange vermeiden, bis Sie sicher sind, dass ein Problem vorliegt.
Wenn es Ihr Programm überhaupt beschleunigt, warum implementieren Sie es dann nicht? Sie haben die Arbeit bereits erledigt, indem Sie die neue Implementierung erstellt haben, sodass Sie durch die neue Implementierung keine zusätzlichen Arbeiten ausführen müssen.
Es sei denn, der Code ist viel schwieriger zu verstehen.
Auch 100 ms bis 90 ms bedeuten 10% mehr Leistung. Eine 10% ige Verstärkung sollte nicht leichtfertig genommen werden.
Die eigentliche Frage ist: Wenn es nur 100 ms dauerte, um überhaupt zu laufen, was war der Sinn, es zu optimieren?
Solange es schnell genug ist, müssen Sie nicht mehr optimieren. Aber dann würden Sie nicht einmal Profiling machen, wenn das der Fall wäre ...
Wenn der Leistungszuwachs gering ist, berücksichtigen Sie die anderen Faktoren: Wartungsfreundlichkeit, Änderungsrisiko, Verständlichkeit usw. Wenn die Fähigkeit zur Pflege oder zum Verständnis des Codes eingeschränkt wird, ist dies wahrscheinlich nicht sinnvoll. Wenn es diese Attribute verbessert, ist es mehr Grund, die Änderung zu implementieren.
In den meisten Fällen ist Ihre Zeit wertvoller als die des Computers. Wenn Sie denken, dass es eine halbe Stunde länger dauert, um herauszufinden, was der Code später macht (sagen Sie, wenn es einen Fehler gibt), und es nur Sie nur ein paar Sekunden gespeichert hat, sind Sie bei einem Nettoverlust.
Es kommt sehr auf das Nutzungsszenario an. Ich gehe hier davon aus, dass der fragliche Code profiliert wurde und somit als der Flaschenhals bekannt ist - d. nicht nur "das könnte schneller sein", sondern "das Programm würde Ergebnisse liefern / schneller fertig werden, wenn das schneller wäre". In Situationen, in denen dies nicht der Fall ist, z. Wenn Sie 99% Ihrer Zeit damit verbringen, darauf zu warten, dass mehr Daten über eine Ethernet-Verbindung übertragen werden, sollten Sie auf Korrektheit achten, aber nicht auf Geschwindigkeit.
Einer der größten Ärgernisse für mich persönlich ist das Finden von Software, die vielleicht zunächst in eine Kategorie fiel und später in eine andere fiel, für die aber niemand mehr benötigte Optimierungen vorgenommen hat. Bis vor kurzem war die Javascript-Performance ein großartiges Beispiel dafür. Moral der Geschichte ist: Entscheide dich nicht nur einmal; Überarbeiten Sie das Problem, wie es die Situation erfordert.
Tags und Links language-agnostic optimization performance