2010-08-06 15 views
6

Kennt jemand Websites/Bücher/Artikel über Best Practices oder Theorie rund um Entwurfsmuster in Hochleistungsanwendungen? Es scheint, dass viele der Muster Indirektion/Abstraktion/Kapselung in einer Weise verwenden, die die Leistung in rechenintensivem Code beeinflussen kann. Head First Design Patterns und sogar GoF erwähnen die Möglichkeit von Performance-Hits mit vielen der Patterns, aber ohne konkretere Ratschläge, wie man damit umgehen soll.Effizienz von Designmustern

Antwort

5

mit Ich bin überrascht, dass wir nicht welchen Performance-Probleme Sie haben fragen!

Meiner Erfahrung nach sind Leistungsprobleme normalerweise an bestimmte Bedingungen und Situationen gebunden. Entwurfsmuster hingegen sind Lösungen für allgemeinere und abstrakte Probleme. Es wäre ein bisschen peinlich, sich beiden im selben Text zu nähern: Was von möglicherweise vielen "nicht gemusterten" Lösungen sollte der Autor die Leistung eines Entwurfsmusters gegen vergleichen? Wenn das Leistungsproblem allgemein ist, gibt es sicherlich schon Muster, um sie zu lösen: das Fliegengewicht ist ein gutes Beispiel.

Die durch die Verwendung eines Entwurfsmusters auferlegten Strafen sind von einem endlichen, sehr kleinen Satz: Einführung von virtuellen Anrufen, zusätzliche Latenz aufgrund von Delegierung, zusätzlicher Speicherverbrauch aufgrund der Verbreitung von Objekten und so weiter. Wenn Sie nach der Profilerstellung feststellen, dass dies die Ursache für Ihre Probleme ist, gibt es Möglichkeiten, diese zu minimieren.

Die Kenntnis der Muster kann auch hilfreich sein, um Leistungsprobleme zu lösen. Erstens hat jemand bereits erwähnt, dass Patterns ein Problem in kleineren Bits aufschlüsseln: Dies könnte die Lokalisierung des Problems erleichtern und hässlichen, aber leistungsfähigen Code isolieren. Sie schaffen auch einen Rahmen für Überlegungen und Erwartungen für Entwickler. Wenn Sie aus Leistungsgründen eine Abweichung einführen müssen, ist es offensichtlich: "Außer hier, wo wir auf X verzichten und Y verbessern, ist dies eine Kette der Verantwortlichkeit." Sie sind Regeln, die bei Bedarf gebrochen werden müssen.

(Ach, ist es ein sehr gutes Muster für eine gute Leistung bekommen: messen, identifizieren, beheben.)

+0

Ihre Antwort ist klarer und artikulierter als meine und sagt ungefähr dasselbe. – Omnifarious

0

Entwurfsmuster konzentriert sich wirklich darauf, wie Sie den Code strukturieren und die Klassenabstraktion und Interaktion definieren. Die Leistung Ihrer Rechenleistung wird hauptsächlich durch die Art und Weise beeinflusst, wie Sie die eigentliche Code-Implementierung (Hauptteil der Methode) schreiben.

Für C++ empfehle ich definitiv, Scott Meyers Buch über Effektive C++ und Effektivere C++ - Reihe von Büchern zu lesen, die an sich wirklich viele Idiome beim Schreiben von Hochleistungscode enthüllt.

+0

Hmm ... sie sind sehr gute Bücher. Aber ich denke nicht, dass viel Zeit für Leistungsprobleme aufgewendet wird. Es gibt einige Fälle, in denen sie Ihnen zeigen "gegebenes Leistungsproblem A, können Sie das lösen, das C++ Idiom B verwendet", aber es gibt nichts über Programmentwurf für Geschwindigkeit in ihnen überhaupt. –

+0

Zustimmen, nicht direkt, aber es ist mehr auf die Wertschätzung des internen Kern/Speicher und wie man sauberen und effektiven Code schreiben. Effizientes C++ auch von Addison Wesley ist wahrscheinlich eher für die gestellte Frage geeignet. Ich habe in den letzten 2 Jahren nicht viel C/C++ geschrieben und die letzten, die ich gelesen habe, waren Jahre zuvor und können daher nicht speziell auf die Details hinweisen. –

4

Es gibt Entwurfsmuster, die Ihnen dabei helfen, Software zu entwickeln oder ihre Flexibilität zu verbessern. Wie Sie das Muster implementieren, hängt davon ab, welche Art von Leistungseinbußen (oder Benefits) Sie bei der Verwendung sehen.

Einige Muster existieren, weil diese allgemeine Strukturierung von Dingen im Allgemeinen zu schnelleren Programmen führt. Aber im Gegensatz zu Algorithmen gibt es keinen guten Weg, ein Muster wirklich formell zu analysieren, um zu entscheiden, wie langsam oder schnell es ist.

Mein Rat wäre, ein Muster zu verwenden, wenn es Ihnen hilft, herauszufinden, wie man ein bestimmtes Stück Code entwirft, oder wenn Sie den Code flexibler oder klarer gestalten müssen. Wenn Sie dann Leistungsprobleme haben, verwenden Sie Standard-Profilerstellungstechniken, um sie zu finden.

Wenn Sie bei Leistungsproblemen ein Refactoring durchführen, ist der Refaktor möglicherweise nicht die Kosten wert, oder vielleicht gibt es eine Möglichkeit, dies zu mildern. Wenn Sie neuen Code entwickeln, gibt es möglicherweise eine Möglichkeit, Dinge zu ändern, um das Leistungsproblem zu beheben, wenn es wirklich in der notwendigen Richtung liegt, damit das Muster funktioniert.

3

Der konkreteste Ratschlag lautet: Profilieren Sie es in Ihrer Anwendung und sehen Sie, welchen Einfluss es wirklich hat.

Alle anderen Ratschläge werden wesentlich allgemeiner und müssen nicht unbedingt gut darauf angewendet werden, wie Sie ein bestimmtes Muster in Ihrer Anwendung mit Ihrem Compiler auf Ihrer Plattform implementiert haben.

0

Sie können Herb Sutters Einträge unter "Effective Concurrency" für Dinge lesen, die Multi-Threading- und Parallelitätsmuster betreffen und deren Auswirkungen auf die Leistung.

http://herbsutter.com/

+0

Was hat das mit GoF Style Design Patterns zu tun? –

+0

OP sprach über High-Performance-Anwendungen und diese Ringe von Multi-Threading und Nebenläufigkeit meiner Meinung nach. – David

+0

Ich habe nicht nach Leistung gefragt. Natürlich ist Threading eine Leistungsoptimierung. Ich habe gefragt, was es mit Designmustern im GoF-Stil zu tun hat. –

1

Entwurfsmuster sind meist Möglichkeiten des Programms in kleinere Stücke brechen, die leichter wiederzuverwenden sind, zusammensetzen, Design und Test. Mehrere Entwurfsmuster führen zu einem Code, der schlechter abschneidet als ein einfacheres Design, aber sie haben einen erheblichen Vorteil, wenn Sie die 80/20-Regel berücksichtigen.

Die 80/20-Regel besagt, dass 80 Prozent der Ausführungszeit Ihres Programms dafür aufgewendet werden, 20 Prozent seines Codes auszuführen. Wenn Ihr Programm schön und modular ist, ist es einfach, es in einen Profiler zu werfen und genau zu sehen, welche Komponente optimiert werden könnte oder wo es sinnvoll ist, mit einem weniger flexiblen Design zu arbeiten, um die Leistung zu verbessern. Durch das Design, das anfangs weit getrennt war, können Performance-Hotspots leichter gefunden werden.

1

Ein Begriff, der Ihnen helfen kann, bessere Treffer zu erzielen, ist 'Mustersprache'. Es ist eine Sammlung von Mustern, die für einen bestimmten Zweck zusammenpassen.Wenn Sie ein genaueres Ziel für eine hohe Leistung haben, hat jemand möglicherweise einen Pfad durch Muster für Ihre Domäne festgelegt, beispielsweise: pattern language for parallel software. Hier ist eine weitere schöne Sammlung von parallel programming patterns von UIUC, eine Brutstätte von Mustern arbeiten.

Die ACE/TAO Jungs haben eine Menge papers über Hochleistungs-Netzwerk-Muster C++

0

GoF Design Patterns ist über bewährte Muster mit gemeinsamen Problemen mit elegant, wartbaren Code zu lösen. Sie zielen nicht auf Leistung ab.

Wenn Sie Muster für die Leistung wollen, müssen Sie möglicherweise an Systemarchitektur Muster, Algorithmen suchen, Datenstrukturen usw.

Was ist Ihre App?

Wenn Ihre Anwendung in C++ ist und vernünftig geschrieben wird, ist die Wahrscheinlichkeit groß, dass Ihr Code auf moderner Hardware blitzschnell läuft, bis er auf I/O warten muss. Die Ausnahme wäre eine Echtzeit-Bildanalyse, die sehr prozessorintensiv ist.

Wenn Leistung ein Problem ist, meinen Sie wirklich I/O-Leistung? (Disk, DB, Netzwerk etc.)

Es gibt ‚Muster‘, die Ihrer Anwendung erlaubt sogar auszuführen, während für die I/O häufig warten (asynchrone Rückrufe etc.)

Wenn Sie mit einer ungleichmäßigen Belastung zu tun , wobei die Spitzenlast viel höher als die durchschnittliche Last sein kann, ist ein üblicherweise verwendetes Architekturmuster, Systemkomponenten mit Nachrichtenwarteschlangen zu entkoppeln.

0

Erinnern Sie sich an das alte Sprichwort "Sie können es gut haben, schnell und billig, wählen Sie zwei"
Design-Muster Adresse das Gute. Es wird eine gute Grundlage benötigt, damit der Code genau und wartbar ist.
Wenn Leistung ein Problem ist, dann Benchmark und optimieren Sie dann die Abschnitte, die Ihnen Probleme bereiten. Oftmals ist die Leistung nur eine Frage der Auswahl eines geeigneten Algorithmus. Aber es kann bedeuten, dass Sie für diese 10%, die 90% der Zeit beanspruchen, einen fürchterlich optimierten Code verwenden müssen. Stellen Sie nur sicher, dass Sie das S ^^ T daraus kommentieren.