2013-04-08 2 views
6

Herb Sutters C++ - Codierungsstandards und Premature pessimization zu vermeiden. Aber ich fühle, dass beide dasselbe tun. Ich erwarte etwas Hilfe, um diese beiden Konzepte mit den verschiedenen unter ihnen zu klären. Wenn Sie mit einigen Beispielen aufwarten, wird es für andere mehr nutzen. Here ist eine gute Erklärung über Premature optimization. Aber ich finde keine für Premature pessimizationVorzeitige Optimierung und vorzeitige Pessimierung in Bezug auf C++ - Codierungsstandards

+0

Übrigens sagte Knut das 1974. Heutzutage bedeutet vorzeitige Optimierung meistens, dass die Release-Version nicht vorzeitig kompiliert wird. Weil der Compiler die 99% des Codes optimieren würde (einschließlich der vom Programmierer vorgenommenen Optimierungen). – SChepurin

+3

@Shepurin Es tut es sicherlich nicht. Vorzeitige Optimierung bedeutet, Teile des Codes zu optimieren (z. B. durch das Schreiben von angeblich schnellem Low-Level-Code, möglicherweise einschließlich Bit-Fiddling, Inline-Assemblierung usw.), ohne einen eindeutigen Beweis dafür zu haben, dass er tatsächlich leistungskritisch ist. –

+0

@Michael Wild - Wie widerspricht das mit dem, was ich gesagt habe? – SChepurin

Antwort

17

Was er durch vorzeitige Pessimierung meint, ist meiner Meinung nach genau das Gegenteil einer vorzeitigen Optimierung: eine grundsätzliche Missachtung, welche Datenstrukturen und Algorithmen zu verwenden sind.

Eine vorzeitige Optimierung betrifft oft winzige Details von Algorithmen, die später optimiert werden können und am Anfang nicht beachtet werden müssen. Die vorzeitige Pessimierung betrifft dagegen das High-Level-Design der Code-Architektur: Eine fundamental ineffiziente Schnittstelle für Ihre Bibliothek zum Beispiel kann später nicht durch Optimierung korrigiert werden, da die öffentliche Schnittstelle ziemlich in Stein gemeißelt ist.

0

Ich würde eher denken, dass vorzeitige Pessimierung ist einfach die Fehlinterpretation von Leistungsanforderungen, die zu vorzeitigen Optimierung führt. d. h. Sie gehen fälschlicherweise davon aus, dass Ihr Code nicht schnell genug arbeitet oder zu viele Ressourcen verwendet (Pessimismus), damit Sie optimieren, wo es nicht notwendig ist.

Mit dem Aufkommen von mehr und vielen großen Datasets tendiere ich dazu, öfter umzukehren, d. H. Das Fehlen eines ausreichenden Pessimismus führt zur Auswahl von Algorithmen, die nicht skaliert werden, um Benutzeranforderungen zu erfüllen. Dies ist oft mit der Überzeugung verbunden, dass die Compileroptimierung eine Art Ersatz für eine schlechte Algorithmusauswahl ist.

2

Es gibt sowohl kleine als auch große Auswahlmöglichkeiten beim Programmieren.

Pessimierung ist, wenn Code in einer Weise geschrieben wird, die "verhindert, dass der Compiler eine gute Arbeit leistet". Ein typisches Beispiel wäre es, Funktionen nicht an einem Ort zu platzieren, der es ihnen erlaubt, inline zu sein, wenn die Funktion WIRKLICH klein und einfach ist (zum Beispiel ein {s, g} -Eter). Dies kann dazu führen, dass die Funktion die 10-fache Zeit benötigt, und es ist so einfach, "richtig zu machen".

Eine Pessimisierung, die ich ein paar Mal auf dieser Website gefunden habe, ist die Verwendung von "a/= 2;" wenn "a >> = 1" gleichwertig ist. Wenn wir wissen, dass a nicht negativ ist, dann haben Verschiebung nach links und Dividieren den gleichen Effekt, aber selbst wenn der Compiler die Aufteilung optimiert, produziert es fast immer mehr Code, um mit "es kann negative" Situation zu bewältigen - und diesen zusätzlichen Code kann in manchen Fällen ein echter Leistungseinbruch sein.

Vorzeitige Optimierung ist, wenn Sie Loops ausrollen oder sonst den Code komplizierter machen, einfach weil Sie dem Compiler keinen guten Job zutrauen - in der Regel ohne Beweise, dass es keinen guten Job machen wird.

Ein anderes Beispiel wäre "nicht mit std::vector", aber Ihre eigenen expandable array weil "Vektor zu langsam ist", ohne den Code mit std::vector getestet zu haben.

+0

Ich bin wahrscheinlich "zu früh" pessimistisch, aber es gibt viele Leute, die kaum programmieren können, daher wird "vorzeitige Optimierung" von ihnen sogar nicht berücksichtigt. – SChepurin

+11

Ich stimme dem ersten Absatz zu, aber ich glaube, Sie haben ihn bei der zweiten verloren. Das Ersetzen von "a/2" durch "a >> 1" ist * genau * die Art der vorzeitigen Optimierung, die Sie einem Compiler überlassen sollten. Schreiben Sie lesbaren Code. Wenn du es durch zwei dividieren willst, * mach das *. Verstehen Sie mich nicht alles auf weniger, Sie können beweisen, dass dieses Stück Code ist Performance-kritisch ** und ** der Compiler wird weniger optimalen Code produzieren. –

+1

Haben Sie sich den Unterschied zwischen 'a/2' und' a >> 1' angesehen? Du wärest überrascht. Ich stimme zu, dass, wenn es am Anfang von 'main' etwas getan hat, es keinen Unterschied macht. Aber Code zu schreiben, der länger ist, nur weil ein Anfänger es nicht lesen kann, ist auch eine schlechte Idee. Wenn jemand ein professioneller C/C++ - Programmierer ist und nicht versteht, dass "a >> 1" dasselbe ist wie "a/2" (zumindest für positive Werte), dann sind sie wahrscheinlich kein sehr erfahrener Programmierer (in C at am wenigsten). –

5

Was Herb bedeutet, ist, dass wenn Sie mit zwei gleich gut lesbaren Optionen konfrontiert sind, wählen Sie immer die effizienteste.

Mit std::vector::reserve() oder der beste Standard-Container oder Algorithmus ist keine vorzeitige Optimierung. Sie würden jedoch nicht verwendet werden vorzeitige Pessimierung.

Vorzeitige Optimierung ist, wenn Sie Lesbarkeit für einige "Optimierung" opfern, die es vielleicht nicht wert wäre. Verwenden Sie einen Profiler dafür.