Ab wann sollten Sie über Leistung nachdenken?

16

Während ich Anwendungen erstelle, frage ich mich ständig, ob dies der beste Weg ist, eine bestimmte Funktionalität auszuführen oder zu implementieren. Oft poste ich Fragen zum Stackoverflow oder zu einem anderen Forum, die nur Feedback benötigen, um Kommentare dazu zu erhalten, wie der Wagen in Bezug auf die Leistung nicht "vor das Pferd gestellt" werden soll. Denken die meisten Programmierer wirklich nicht über die Leistung nach, bis die Anwendung beendet ist, oder ist die Leistung absolut inakzeptabel? Ich verstehe, dass sich Entwicklungsumgebungen von Produktionsumgebungen unterscheiden und dass Sie sich nicht vollständig auf die Ergebnisse Ihres Entwickler-Laptops verlassen sollten. Es gibt jedoch Vorgehensweisen und Techniken, die eine bessere Leistung bringen als andere.

Ist es üblich, die Leistung während des gesamten Entwicklungsprozesses zu berücksichtigen? Soll ich diese Überlegungen verschieben, bis die Leistung tatsächlich steigt?

Aktualisieren

Um es klar zu sagen, ich spreche über die Situation, in der Sie überlegen oder gerade an einem Teil der Funktionalität arbeiten. Sie wissen, dass es mehrere Möglichkeiten zur Implementierung gibt, aber Sie sind sich nicht sicher, wie gut sich die einzelnen Implementierungen skalieren lassen. Es kann auch verschiedene Techniken geben, mit denen Sie nicht einmal vertraut sind. Im kleinen Maßstab wäre wahrscheinlich jeder der Ansätze angemessen, aber im größeren Maßstab werden einige mithalten und andere nicht. Wenn ich nach Meinungen oder Ratschlägen frage, lautet die Antwort oft: Mach dir später Sorgen ...

Cognitronic
quelle
Ich versuche, keinen Bullshit zu schreiben, der die ganze Zeit schrecklich skaliert. Es ist mir egal, ob diese vollkommen klare Zeile im Startcode eine Handvoll CPU-Zyklen mehr in Anspruch nimmt als eine stark verstümmelte "optimierte" Version davon. Über welche Art von "Denken über Leistung" sprechen Sie?
Daaaahling, ist das nicht offensichtlich? Wenn Sie auf Ihr Vorsprechen warten!
Matt Ellen

Antworten:

24

Die Verschiebung von Leistungsüberlegungen beruht manchmal auf einer fehlerhaften Anwendung des Ausdrucks:

Vorzeitige Optimierung ist die Wurzel allen Übels.

Wenn Sie das vollständige Zitat lesen, versuchte Knuth zu sagen, dass Mikrooptimierungen, die während der Entwicklung ohne Profilerstellung angewendet wurden, im Allgemeinen nicht empfohlen werden, da sie zu weniger wartbarem Code führen, ohne dass wesentliche Leistungsvorteile erzielt werden.

Das bedeutet jedoch nicht, dass Sie die Leistung erst in Betracht ziehen sollten, wenn die Anwendung fast fertig ist. Wenn Sie dies tun, stellen Sie möglicherweise fest, dass die Leistung unzureichend ist, Ihre Entwurfsarchitektur keine bessere Leistung unterstützt und Sie müssen von vorne beginnen.

Es gibt eine Reihe von Dingen, die Sie während der Entwicklung tun können, um eine gute Leistung ohne esoterische (und vorzeitige) Optimierungen zu erzielen:

  1. Verwenden Sie eine vernünftige, durchdachte Architektur.
  2. Verwenden Sie Datenstrukturen richtig.
  3. Verwenden Sie Technologien (Bibliotheken, Frameworks), die eine angemessene Leistung erbringen.

Wenn Sie diese Schritte ausführen, werden Sie feststellen, dass die erforderliche Leistungsoptimierung auf einen kleinen Teil Ihres Codes beschränkt ist. Durch die Profilerstellung wird dieser Code identifiziert, und Sie können Ihre Leistungsverbesserungen dort einsetzen, wo sie am besten funktionieren, ohne die Wartbarkeit zu beeinträchtigen.

Robert Harvey
quelle
5
+1, um eine gut gemeinte, aber überstrapazierte Phrase des großen Weisen in einer Weise zu beleuchten, die umsetzbar ist. Ich kenne viel zu viele Programmierer, die diesen Satz genauso gut in einen Sampler über ihren Workstations stecken könnten, da sie ihn jeden Tag als Begründung dafür verwenden, dass sie sich keine Mühe geben, eine gute Lösung für ein Problem zu finden, bevor sie eine Lösung dafür programmieren .
Adam Crossland
@Adam - Vielen Dank! Ich stimme vollkommen zu! Ich persönlich verstehe nicht, warum Sie sich nicht die Mühe machen wollen, Dinge zu durchdenken, bevor Sie eine Menge Code schreiben.
Cognitronic
+1 für die drei Punkte. Sie sind alle an das System genagelt, wenn Sie fertig sind, und legen großen Wert auf die Optimierung der Leistung. Diese Erhöhung kann man einfach nicht bekommen, wenn alles fertig ist. Kann auch nicht mehr mit Adam übereinstimmen, dass einige Leute das Zitat als Schutzschild zum Nachlassen benutzen.
Zekta Chan
20

Folgendes ist NICHT zu beachten:

  • Ist ++ischneller als i++?
  • Ist switchschneller als if?
  • Soll ich inlinemeine Funktionen?
  • Sind virtuelle Funktionen langsam?
  • Ist C ++ / Java / C # schneller / langsamer als das andere?
  • bla, bla, ...

Folgendes ist zu beachten:

  • Was ist eine realistische erwartete Arbeitsbelastung?
  • Wie oft ändern sich die Eingabeinformationen und wer stellt sie zur Verfügung? Ist es sinnvoll, eine Vorkompilierung in Betracht zu ziehen?
  • Habe ich meine Datenstruktur so einfach und normal wie möglich gehalten? Das bedeutet, dass Sie sich keine Gedanken über Hashing und ähnliches machen müssen.
  • Habe ich Benachrichtigungen auf das absolute Minimum beschränkt? (Hier erfordern Änderungen an einem Teil der Daten zeitgleiche Änderungen an einem anderen Teil, da die Datenstruktur nicht normalisiert ist.)

In Bezug auf den letzteren Punkt ist es meiner Erfahrung nach am besten, die Datenstruktur so zu gestalten, dass sie, wenn sie nicht normalisiert werden muss, vorübergehende Inkonsistenzen toleriert, die später durch eine Art periodischen Sweep behoben werden können. Ein Hauptmörder der Leistung ist, wenn Benachrichtigungen weitere Benachrichtigungen auslösen, die in einem Ausmaß ausgelöst werden, das Sie zuvor nicht erwartet hätten. Und oft ist es Mühe wert, Änderungen von selbst rückgängig zu machen.

Wenn Sie dies alles getan haben, haben Sie ein klares Design. Dann in regelmäßigen Abständen, wie Sie es entwickeln, Profil. ( Zufallspause ist die Methode, auf die ich mich verlasse.) Wenn Sie dann sehen können, dass die Leistung durch die Einführung eines ausgefeilteren Algorithmus verbessert wird, tun Sie dies auf jeden Fall.

Mike Dunlavey
quelle
2
Gute Antwort; Zu schade, dass die Frage so schnell in die Knie gezwungen wurde, oder du hättest ein wenig mehr Wiederholung bekommen können. In der Bearbeitungshistorie gab es früher einen Audit-Trail, um zu zeigen, wann dies geschah und warum; jetzt scheint es, dass das SE-Netzwerk es heimlich tut.
Robert Harvey
@ Robert: Ja. Traurig. Ich muss nur in meinem virtuellen Bier weinen gehen :-)
Mike Dunlavey
3

Nein, Sie sollten von Anfang an über die Leistung nachdenken (insbesondere beim Entwerfen von Datenbanken). Menschen, die eine Optimierung für eine vorzeitige Optimierung halten, haben unserer Branche großen Schaden zugefügt. Das Zitat sollte ursprünglich verhindern, dass Personen sich mit Mikrooptimierungen befassen, bevor ein Problem aufgetreten war. Es war nicht beabsichtigt, überhaupt keine Optimierung durchzuführen. In einer Datenbank gibt es zum Beispiel viele bekannte Techniken, die eine schlechte Leistung erbringen. Diese zu vermeiden, ist ein Teil dessen, was Sie tun müssen. Es ist sehr schwierig, eine Datenbank mit 100.000.000 Datensätzen umzugestalten, da sie mit schlecht durchdachten Techniken erstellt wurde und wir das Problem nicht mehr vermeiden können, indem wir bessere Hardware kaufen.

HLGEM
quelle
3

Sorgen Sie sich zuerst um die Richtigkeit 1 , dann um die Wartbarkeit, dann um die Sicherheit und Zuverlässigkeit, und dann können Sie über die Leistung nachdenken. Wenden Sie diese Reihenfolge auf jeden Code an, während Sie ihn entwickeln. Es ist möglich, dass eine performante Lösung nicht einfach darin besteht, die Dinge klar und einfach zu halten.

80% der Leistung sucht den richtigen Algorithmus und die richtige Datenstruktur für das jeweilige Problem aus. Eine schlecht optimierte Quicksorte ist im Durchschnitt immer noch die beste Wahl für eine hoch optimierte Bubble-Sorte (im schlimmsten Fall ist es ein Unentschieden).

Was jeder auf SO versucht, zu verbessern, ist die Einstellung "schneller, ++ p oder p ++", bei der die Leute den Compiler so überlisten, dass sie das größere Problem aus den Augen verlieren, was zu sprödem, fehlerhaftem Code führt -gerade, falsch und das Beste von allem, nicht viel schneller als eine einfachere Lösung gewesen wäre. Ich habe mich aus erster Hand mit dieser Art von Code befasst. Ein Beispiel war so spröde, dass wir keine Änderungen vornehmen konnten , ohne es vollständig zu brechen.


1 Wobei "Korrektheit" "Erfüllung der Spezifikation" bedeutet, was nicht gleichbedeutend ist mit "fehlerfrei".

John Bode
quelle
1
Einige Spezifikationen definieren eine Leistungsanforderung. Wie würde sich dies auf Ihre Bestellung auswirken?
Ben L
@ Ben: Idealerweise keine. Wenn Sie jedoch die oben genannte Reihenfolge einhalten und eine hohe Leistungsanforderung immer noch nicht erfüllen, besteht der erste Schritt darin, ein Profil zu erstellen, um Ihren Engpass (duh) zu ermitteln. Danach ist es ein Urteilsspruch; opfern Sie Wartbarkeit, Sicherheit oder Zuverlässigkeit? Ich kann mir keine einheitliche Lösung vorstellen. Ich bin paranoider in Bezug auf Sicherheit und Zuverlässigkeit, daher würde ich wahrscheinlich zuerst die Lesbarkeit austauschen, aber es könnte sein, dass die Laufzeitumgebung selbst sicher und stabil genug ist, um die beiden anderen zu tauschen.
John Bode
2

Sie sollten über Leistung nachdenken, sobald Sie wissen, was "gute" Leistung ist. Mit anderen Worten, es wäre falsch, sich Gedanken über die Leistung zu machen, bevor Sie die folgenden Schwellenwerte ermittelt haben:

  • Inakzeptable Leistung - Beheben Sie sie jetzt, bevor sie außer Kontrolle geraten
  • Akzeptable Leistung - Es ist an der Zeit, sich auf andere Funktionen zu konzentrieren, bevor Sie versuchen, mehr mit der Leistung zu tun.
  • Zielleistung - idealisierte Leistungszahlen. Wenn Sie also genügend Zeit und Ressourcen haben, was würde Ihr System tun müssen?

Sobald Sie diese Schwellenwerte ermittelt haben, haben Sie auch die Metrik ermittelt, mit der Sie die Leistung messen. Das bedeutet, dass Sie einige automatisierte Leistungstests einrichten können, die Sie mehrmals täglich ausführen können. Das wird dir sagen, ob es dir besser oder schlechter geht.

Um diese Metriken zu ermitteln, müssen Sie wissen, was Ihr System tun muss. Werden beispielsweise absolute Leistungsmetriken (Antwort innerhalb der X-Zeit) oder Durchsatzmessungen (X Antworten pro Y-Zeit) benötigt? Durchsatz- und absolute Zeitoptimierungen erfordern unterschiedliche Ansätze. Wenn Sie nicht genau wissen, worauf es ankommt, optimieren Sie möglicherweise falsch.

Berin Loritsch
quelle
1

Sie haben wahrscheinlich gehört, dass vorzeitige Optimierung die Wurzel allen Übels ist. Die Frage ist, was macht es verfrüht? Meiner Meinung nach ist es nie eine schlechte Idee, über Leistung nachzudenken, aber sorgen Sie sich nicht übermäßig, bis Ihr Code funktioniert. Sobald es funktioniert, führen Sie einige Tests mit hoher Last durch, profilieren und identifizieren Sie Engpässe und optimieren Sie Ihre Leistung.

That being said, es mit dem Denken über die Leistung während der ersten Codierstufe nichts falsch ist , wenn Sie wissen , bestimmte Techniken , die einen wirklichen Unterschied machen. Wenn Sie beispielsweise eine Speicherstruktur aus einer Bibliothek einer anderen vorziehen, haben Sie in der Vergangenheit festgestellt, dass eine davon schneller ist und weniger RAM als die andere benötigt. Oder in einem Gebäude einfach (man kann es machen anspruchsvollere , wenn spätere Tests erfordern) Caching - System für Daten , dass Sie wissen ,wird viel zugegriffen und wäre viel besser zwischengespeichert. Auf diese Weise ärgern Sie sich nicht zu sehr über die Leistung (zumindest nicht anfangs), sondern verwenden Tipps und Tricks, die Sie auf dem Weg durch andere Projekte gelernt haben. Versuchen Sie, diese einfach zu halten, damit sie bei der ersten Entwicklung leicht berücksichtigt werden können, und bieten Sie möglicherweise auch einige Vorteile.

FrustratedWithFormsDesigner
quelle
1

Die Leistung sollte in den system- und benutzerbezogenen Spezifikationen Ihres Anforderungsdokuments aufgeführt sein. Ich kenne viele Leute, die sich über die Idee lustig machen, eine Anforderungsanalyse bei der Entwicklung einer Anwendung durchzuführen. Erstaunlicherweise gibt ein solches Dokument eine präzise Antwort darauf, wofür und wo Sie Ihre leistungsbezogenen Ressourcen verwenden sollten, wenn die Anwendung fast fertig ist. Und es wird diese Frage rechtzeitig beantworten

Die Dokumentation der Anforderungen erspart Ihnen Hunderte von Stunden Zeit, die sonst für nicht wesentliche Prozesse verschwendet würden.

kloucks
quelle
1

Ein ausgewogener Ansatz wäre besser. Leistung ist wichtig, aber nicht so wichtig wie das Erledigen von Aufgaben.

  1. Erstellen Sie zunächst ein Feature, in dem Sie versuchen, ein wenig darüber nachzudenken, was Sie tun und wie Sie es tun (nehmen Sie sich ein wenig Zeit, um über Leistung nachzudenken, aber nicht viel).
  2. Probier es aus
  3. once ist am Laufen und überlegt, ob es wirklich notwendig ist, es zu verbessern (im Allgemeinen nicht, aber in manchen Fällen vielleicht).

Dies ist meine übliche Herangehensweise an Leistung und Funktionalität. Im Allgemeinen hängt alles davon ab, was das Programm tut und ob es erforderlich ist, die Funktionsweise zu verbessern und wie viel Zeit es mich kosten würde.

Lassen Sie uns über eine Q & A-Website wie diese nachdenken. Ich denke, diejenigen, die dahinter stecken, haben sicherlich viel darüber nachgedacht, wie man das Stellen einer Frage und das Erhalten der Antwort so zeit- und kosteneffizient wie möglich macht. Wenn Sie jedoch über Benachrichtigungen nachdenken, spielt es keine Rolle, ob hin und wieder Benachrichtigungen angezeigt werden und Sie darüber informiert werden, dass eine neue Antwort oder etwas anderes vorliegt.

Guiman
quelle
1

Es gibt eine Möglichkeit, die Leistung sicher zu verschieben: Verwenden Sie nach Möglichkeit domänenspezifische Sprachen.

Wenn der größte Teil Ihrer Entwicklung mit Ihren eigenen kleinen DSLs durchgeführt werden kann und diese gut genug entworfen sind, um Ihre Problemdomäne in der allgemeinsten und allgemeinsten Form auszudrücken, ist es möglich, zuerst einen funktionierenden Prototyp zu erhalten, ohne jemals darüber nachzudenken Leistung, und verbessern Sie dann nur Ihre DSLs-Implementierungen, nicht den eigentlichen Problemdomänencode.

Auch aus Sicht der Wartbarkeit ist dies ein viel besserer Ansatz.

SK-Logik
quelle
1

Sie sollten die Leistung berücksichtigen. Sie müssen jedoch eine Linie ziehen, um das Ende der Abstimmung zu markieren, da (normalerweise) Ihre Zeit wichtiger ist als die des Computers.

Ein wirklich guter Textartikel zur Performance ist: The Computer Performance Shell Game .

Das Computer-Performance-Shell-Spiel, das auch als "Find the Bottleneck" bezeichnet wird, wird immer zwischen diesen vier Ressourcen gespielt:

  • Zentralprozessor
  • Platte
  • Netzwerk
  • Erinnerung

Ihr Computer wartet zu jedem Zeitpunkt darauf, dass ein Vorgang für eine dieser Ressourcen abgeschlossen wird. Aber welche: CPU, Speicher, Festplatte oder Netzwerk? Wenn Sie an Leistung interessiert sind, müssen Sie als Erstes feststellen, welcher dieser Engpässe die Leistung derzeit beeinträchtigt - und ihn beseitigen.

vz0
quelle
0

Der "beste" Weg ist ein sehr belasteter Begriff, und die Antwort kann in hohem Maße von Faktoren abhängen, die erst zur Laufzeit bekannt sind.

  • Hast du viel gedächtnis - Mit einer Datenstruktur "All-in-Memory" erzielen Sie eine bessere Leistung. Wenn Sie jedoch nicht genügend Speicher austauschen, wird Ihre Leistung beeinträchtigt.
  • Benötigen Sie Ausdauer? Eine Datenbank bietet Integrität, ist jedoch langsamer als die oben genannte Datenstruktur "All-in-Memory". VIEL langsamer.
  • Können Sie die Ergebnisse zwischenspeichern? Lack kann dabei helfen! http://www.varnish-cache.org/

Die Liste geht weiter und weiter.

Was Sie können tun, ist „die einfachste Sache , die möglicherweise Arbeit könnte“ zu schreiben , von dem Wissen , das Sie derzeit tun haben, und es in einer tut modulare Art und Weise , so dass Sie leicht reorganisieren , wenn Sie mehr wissen. Beachten Sie, dass das "Einfachste" nicht unbedingt einfach ist!

user1249
quelle
0

Es ist immer etwas, woran Sie denken sollten. Ich denke, die meisten Leute versuchen zu sagen, dass es nicht sinnvoll ist, zwei Tage damit zu verbringen, etwas zu optimieren, von dem Sie nicht einmal wissen, dass es kaputt ist. Sobald Sie ein Produkt zum Laufen haben und einige Usability-Tests durchführen können, sollte dies Ihnen zeigen, wo Sie Leistungsprobleme haben. Sobald Sie die tatsächlichen Leistungsprobleme identifiziert haben, können Sie gezielt die Optimierungen vornehmen, die Sie durchführen müssen.

Jesse McCulloch
quelle
0

Zumindest theoretisch sollten Sie sich Gedanken über die Leistung machen, wenn Sie sich im Beta-Test befinden und nicht vorher.

Dies ist jedoch keine Lizenz, um schlechte Designentscheidungen zu treffen. Die Verwendung einer NVARCHAR-Zeichenfolge als Primärschlüssel ist beispielsweise ein sicherer Weg zu einer schlechten Leistung. das heißt, es ist eine schmutzige Angewohnheit, unabhängig von den Leistungsproblemen, und Sie sollten nicht in erster Linie verwenden.

Wenn Ihr Design herkömmlichen Best Practices folgt (alles in der 3. normalen Form, korrekte Informationen, die sich in Ihren Klassen verbergen, minimale Verwendung von Singletons usw.) und später ein Leistungsproblem auftritt, ist es einfach zu handhaben (erstellen Sie hier einen Index, dort einen Cache implementieren).

HTH

grinsender Mann
quelle
0

Es hängt davon ab, ob. Beachten Sie die 80/20-Regel: Der Großteil (sagen wir mal 80%) des Codes in der Anwendung wird nie oft genug ausgeführt, um die Leistung spürbar zu verbessern. Sie müssen sich auf die verbleibenden 20% konzentrieren, bei denen die App etwa 80% ihrer Ausführungszeit benötigt.

Möglicherweise können Sie einige der offensichtlichen Leistungsschwerpunkte im Voraus identifizieren , z. B. wenn Sie wissen, dass eine bestimmte Berechnung millionenfach wiederholt wird. In solchen Fällen lohnt es sich auf jeden Fall, über eine Optimierung im Vorfeld nachzudenken, indem die richtigen Datenstrukturen und Algorithmen für den Job ausgewählt werden.

Diese Optimierung ist jedoch eher eine Entwurfsaktivität. Was in der Regel wertlos ist, sind Mikrooptimierungen, bei denen jemand übermäßig viel Zeit mit cleveren Tricks im Namen des "Leistungszuwachses" verbringt. Insbesondere, wenn vorher und nachher keine entsprechenden Messungen durchgeführt wurden, können solche Änderungen keinen Unterschied machen oder die App unter realen Umständen verlangsamen.

Péter Török
quelle
0

Es hängt davon ab, in welcher Entwicklungsphase Sie sich befinden

1) Wenn Sie die Funktionalität Ihrer Software aufbauen, stellen Sie sicher, dass diese einwandfrei (dh erwünscht und effizient) funktioniert.

2) Sobald die Bausteine ​​integriert sind, erhalten Sie einen Hinweis auf Resource Hogger. Dort haben Sie Raum für Optimierungen.

Sisya
quelle
0

Wenn Sie anfangen müssen , über Leistung nachzudenken, sind Sie in Schwierigkeiten. Sie sollten die ganze Zeit über Leistung nachdenken. Tatsächlich vermute ich, dass gute Programmierer über Leistung nachdenken werden, auch wenn sie dies nicht beabsichtigt hatten, in einer Art und Weise, dass Männer alle sieben Sekunden über Sex nachdenken.

Was wichtig ist, ist, welche Maßnahmen Sie basierend auf all diesen Überlegungen ergreifen werden. Gedanken sind billig, aber Aktionen können Code brechen und Fristen sprengen.

In den meisten Fällen ist es nur sinnvoll, nichts zu tun: Sie haben festgestellt, dass Ihr Code nicht häufig genug aufgerufen wird, damit Leistungsprobleme erkennbar sind - möglicherweise handelt es sich um einen Startcode, der einmal pro Computer ausgeführt wird 1% Ihrer potenziellen Benutzerbasis. Möglicherweise handelt es sich um ein kleines Stück redundanten Servercodes, der in einem Meer langsamer Datenbankzugriffe untergeht. Möglicherweise handelt es sich nur um eine ganzzahlige Zuweisung in einem unkritischen Codeabschnitt.

Sehr oft vermuten Sie, dass ein bestimmter Vorgang ein Leistungsproblem verursacht, das durch eine einfache Änderung behoben werden kann. Es gibt zum Beispiel das quälende Gefühl, bei jeder Anfrage eine komplexe SQL-Abfrage auszuführen oder zweimal nach denselben Daten aus einem Wörterbuch zu fragen. Hier ist das Wissen über Optimierungstechniken von Vorteil, und vielleicht passiert die überraschendste Schlussfolgerung:

Wenn Sie eine schnelle Technik kennen, die mit ziemlicher Sicherheit die Leistung eines Codeteils verbessert, tun Sie dies nicht.

Wenn Sie jetzt daran denken können, können Sie es sicher in fünf Minuten später tun. Wenn Sie den Code aus dem Code heraushalten (aber möglicherweise in einem // TODOKommentar), wird der Code bereinigt und Sie sparen Zeit, um an einer anderen Funktion zu arbeiten, und es wird keine Zeit verschwendet, wenn Sie den Code später wegwerfen. Wenn sich herausstellt, dass der ursprüngliche Code beim Testen zu Leistungsproblemen führt, wenden Sie Ihre schnelle Technik an.

Ich sage hier nicht, dass Sie vermeiden sollten, Code zu schreiben, der idiomatisch ist, nur weil er zufällig schneller ist. Schreiben Sie idiomatischen Code nach bewährten Methoden, die die Produktivität und Lesbarkeit verbessern und Fehler reduzieren. Es ist nur so, dass Sie sich immer für Lesbarkeit anstatt für Geschwindigkeit entscheiden, wenn Sie die Wahl zwischen idiomatischem Code nach dem Vorbild und einer schnelleren, aber einfach zu beschreibenden Alternative haben.

Die einzige schwierige Situation besteht darin, dass es scheinbar keinen einfachen Weg gibt, die Code-Performance zu verbessern, und es dennoch schmerzlich offensichtlich ist, dass ein Teil des Codes sofort nach seiner Bereitstellung kaputt geht - eine vollständige Datenbanküberquerung bei jedem Klick, hundert SQL-Anforderungen pro Seite auf der Website oder etwas ähnlich Schreckliches. Hier müssen Sie tatsächlich anhalten und noch etwas nachdenken. Dies sind normalerweise Architekturprobleme, die ohnehin nicht lokal gelöst werden können. Bestätigen Sie Ihre Vermutungen mit einem kurzen Impuls oder einem Prototyp, suchen Sie nach ähnlichen Erfahrungen und gemeinsamen Lösungen und erwägen Sie entweder eine Änderung der Architektur oder einen Rückgang der Funktionen.

Victor Nicollet
quelle
0

IMHO ist es wichtig, über die Leistung nachzudenken, bevor Sie das System implementieren, aber nur darüber nachzudenken. Sie sollten die Anwendung analysieren und mögliche Leistungsengpässe ermitteln.

Dann implementieren Sie das System so einfach wie möglich. Wenn Leistungsprobleme auftreten, optimieren Sie.

Angenommen, Sie haben einen GUI-Client, der Daten über einen Dienst (SOAP, REST-HTTP usw.) abruft. Das Wichtigste für eine hohe Leistung / Skalierbarkeit ist dann, dass so wenig Anrufe wie möglich getätigt werden und bei jedem Anruf eine Menge Daten zurückgegeben werden, anstatt dass bei vielen Anrufen jeweils eine kleine Information zurückgegeben wird.

Bei der Implementierung eines solchen Systems ist mir die Anzahl der Anrufe zwischen den Systemen nicht so wichtig. Aber ich würde sicherstellen, dass die Codebasis es mir leicht machen würde, neu zu faktorisieren / zu optimieren, wenn die Bedürfnisse auftauchen.

Pete
quelle
0

Sie sollten von Anfang an sehr allgemein über Leistung nachdenken. Sie sollten Datenstrukturen und Algorithmen auswählen, die für Ihre Anwendung gut funktionieren und einigermaßen effizient sind. Algorithmen sind von grundlegender Bedeutung für die Software und Datenstrukturen. Sie müssen wahrscheinlich größere Änderungen vornehmen, wenn Sie größere Änderungen vornehmen müssen, während kleinere Details einfacher umgeschrieben werden können.

Möglicherweise möchten Sie auch effiziente Gewohnheiten erlernen, die jedoch von der Sprache abhängen. In C ++ beispielsweise "++ i;" als eigenständige Anweisung oder Ausdruck ist immer mindestens so gut wie "i ++;" und könnte möglicherweise viel effizienter sein. In den meisten Fällen sollten Sie jedoch klaren Code schreiben und dem Compiler vertrauen. Die Gewohnheit, sich Gedanken über Mikroeffizienzen zu machen, wird mit ziemlicher Sicherheit mehr Probleme verursachen als lösen. Für Desktop - Anwendungen, entweder der Compiler ist mindestens so intelligent wie Sie über Dinge wie sind i >> 1gegen i / 2, oder die beste Art und Weise zur Verbesserung der Leistung ist es, einen besseren Compiler zu bekommen, also keine Sorge darüber.

Machen Sie sich darüber hinaus keine Sorgen, bis Sie etwas haben, das Sie testen können. Zu diesem Zeitpunkt können Sie das Programm profilieren, um festzustellen, wo sich die Hotspots befinden, und erhalten möglicherweise eine Vorstellung davon, ob Sie ein Performance-Programm haben oder nicht. Wenn Sie die Leistung verbessern möchten, ermitteln Sie, wo das Programm die meiste Zeit verbringt, und verbessern Sie die dortigen Aspekte. Wenn Sie eine angemessene globale Effizienz entwickelt und das Programm gut geschrieben haben, ändern Sie nur einen relativ kleinen Teil des Programms.

David Thornley
quelle
0

Ich denke, das Beste, was Sie tun können, ist, gute Designpraktiken zu befolgen (z. B. Dinge, von denen Sie wissen, dass sie die Leistung beeinträchtigen), bis Sie etwas zum Laufen bringen. Wenn Sie die Verbesserung nicht messen können, können Sie auch keine Verbesserung erzielen. Sobald Sie etwas haben, mit dem Sie testen können, ist es oft eine gute Idee, einen Profilierungslauf durchzuführen und eine Vorstellung davon zu bekommen, wo sich die Hotspots (falls vorhanden) befinden. Wenn Ihnen etwas auffällt, sollten Sie in Betracht ziehen, den Problembereich umzugestalten oder neu zu schreiben, aber wenn es nicht so schlimm ist (nur weil der Code 90% seiner Zeit mit zwei oder drei Methoden verbringt, hat dies keine Bedeutung, wenn die Gesamtleistung angemessen ist). dann einfach weiterentwickeln. Etwas, das ich mehr als einmal gesehen habe, sind Entwickler, die Tage damit verbringen, den komplexesten Teil des Systems zu optimieren.

TMN
quelle
0

Wann sollte ich darüber nachdenken? Wie viel Aufwand sollte ich investieren? Das hängt von der Cockburn-Skala des Projekts ab. (Mit anderen Worten, wie hoch ist das Risiko, keine gute Leistung zu erbringen?)

Erlernen Sie die Grundlagen frühzeitig (siehe Antwort von Robert Harvey ). Um leistungsorientiertes Denken in verschiedenen Phasen der Softwareentwicklung anzuwenden, muss der Entwickler es genau kennen, damit der Denkprozess nicht durch diese zusätzlichen Überlegungen behindert wird. (Mit anderen Worten, denken Sie über die Leistung nach, bevor das Projekt konzipiert wird.)

Setzen Sie in der frühen Entwicklungsphase die Tools zur Leistungsprofilerstellung großzügig ein und verfolgen Sie den Verlauf der Statistiken. Achten Sie besonders auf die Organisation solcher Informationen, damit sie für spätere Entscheidungen nützlich sind.

Abhängig von der Art Ihres Projekts und der Cockburn-Skala:

  • Rapid Prototyping oder "Code loswerden, als gäbe es kein Morgen" oder Eigenentwicklung mit geringen geschäftlichen Auswirkungen: Behalten Sie einfach die Statistiken. Denken Sie noch nicht an die Leistung. Implementieren Sie die Funktion auf einfachste Weise. Halten Sie sich an den ersten Algorithmus, der Ihnen in den Sinn kommt.

    • In der späteren Projekthälfte werden Ad-hoc-Leistungstests durchgeführt, um "Hotspots" anhand der tatsächlichen Anwendungsfälle zu identifizieren. Wenn ein Leistungsproblem vorliegt, das die Software unbrauchbar macht, sollte es leicht identifizierbar sein.
    • Für eine interne Entwicklung mit geringen Auswirkungen auf das Geschäft müssen Sie nur den Code bereitstellen und Leistungsprobleme später beheben.
  • Desktop-Anwendungen, für die ein konsistenter, umfassender Leistungsansatz erforderlich ist. Es muss nicht stark optimiert werden; Es sollte jedoch so wenig "Hangs" (Nichtreagierbarkeit) wie möglich geben.

    • Desktop-Anwendungen weisen normalerweise sehr verschlungene Ausführungspfade auf, was das leistungsorientierte Denken erschwert. Ein mehrschichtiges Design ermöglicht die Trennung von Datenbank- / Netzwerkleistungsproblemen von GUI-Leistungsproblemen, die von verschiedenen Experten in Ihrem Team behandelt werden können.
    • Durch die Protokollierung von Traces können Hotspots identifiziert werden.
  • High Performance Computing, bei dem die Hardware optimal genutzt werden muss.

    • Beauftragen Sie jemanden in Ihrem Team mit der Analyse und dem Reporting der Leistungsstatistik.
    • Machen Sie Theorien über die Leistungsmerkmale, überprüfen Sie sie mit Experimenten und vergleichen Sie sie mit Ihren Vorhersagen aus vereinfachten Comp-Sci-Modellen.
    • *
pro Sekunde
quelle
0

Am Anfang. Identifizieren Sie die erforderlichen Leistungsmerkmale. Wenn Sie das Ziel nicht identifizieren können, müssen Sie entweder einen Schritt zurücktreten, um Ihre Anforderungen besser zu verstehen, oder aufschieben, bis Sie Ihre Komponentenanforderungen mit dem Risiko kennen, das Sie möglicherweise umschreiben. Dann testen. Nicht optimieren, testen. Wenn Ihr Code den Leistungstest nicht besteht, optimieren Sie. Wenn ein Test-Framework vorhanden ist, sollte die Verwendung vorhandener Tools zur Leistungsüberwachung die Aufgabe relativ einfach machen.

Halten Sie die Leistungstests während der gesamten Projektlaufzeit als Regressionstest an Ort und Stelle. Der Wartungscode ist dafür berüchtigt, Leistungsprobleme auszulösen, da die 'Korrekturen' häufig einen sehr engen Fokus haben.

Jim Rush
quelle
0

Ich verlasse mich immer auf eine einfache Formel:

  1. Bring es zum Laufen
  2. Richtig machen
  3. Mach schnell

... in dieser Reihenfolge.

Nach c2 wird diese Formulierung Kent Beck zugeschrieben .

Daniel Pryden
quelle