Frage

Zur Zeit arbeite ich für einen Kunden, der sind versteinert ändern lausig un-prüfbar und un-wartbaren Code wegen der „Performance-Gründen“. Es ist klar, dass es viele falsche Vorstellungen laufen weit verbreitet sind und die Gründe nicht verstanden werden, sondern nur mit blindem Glauben gefolgt.

Ein solcher anti-Muster, das ich über gekommen sind, ist die Notwendigkeit, so viele Klassen wie möglich zu markieren, wie versiegeltes internes ...

* RE-Edit:. Ich sehe Markierung alles wie versiegelt intern (in C #) als vorzeitige Optimierung *

Ich frage mich, was sind einige der anderen Performance-anti-Muster Menschen bewusst sind oder kommen über?

War es hilfreich?

Lösung

Die größte Leistung anti-Muster, das ich gestoßen bin ist:

  • Nicht Messung der Leistung vor und nach den Änderungen.

Sammel Leistungsdaten werden zeigen, ob eine bestimmte Technik erfolgreich war oder nicht. Nicht so tun wird in ziemlich nutzlos Aktivitäten zur Folge hat, weil jemand das „Gefühl“ der erhöhten Leistung hat, wenn nichts geändert hat.

Andere Tipps

Der Elefant im Raum. Die Konzentration auf die Umsetzung Ebene Mikro-Optimierung statt auf bessere Algorithmen

Variable Wiederverwendung.

habe ich diese ganze Zeit zu tun, herauszufinden, ich war ein paar Zyklen auf der Erklärung Speicher und Speicherbedarf zu senken. Diese Einsparungen waren winzigen Wert im Vergleich zu, wie widerspenstig es, den Code zu debuggen gemacht, vor allem, wenn ich um einen Codeblock bewegt endete und die Annahmen über Werte beginnen geändert.

Vorzeitige Performance-Optimierungen in den Sinn kommt. Ich neige dazu, Performance-Optimierungen, um jeden Preis zu vermeiden, und wenn ich mich entscheide ich sie brauche gebe ich das Problem um zu meinen Kollegen mehr Runden versuchen, um sicherzustellen, dass wir die obfu setzen ... eh Optimierung in der richtigen Stelle.

Eines, das ich habe laufen in Hardware wurde bei ernsthaft gebrochen Code werfen, in einem Versuch, es schnell genug zu machen, sozusagen die Umkehrung von Jeff Atwood Artikel in Rulas' Kommentar erwähnt. Ich rede nicht über den Unterschied zwischen eine Art zu beschleunigen, die einen einfachen, korrekten Algorithmus verwendet, indem sie auf schnellere Hardware läufst gegen einen optimierten Algorithmus. Ich spreche über ein offensichtlich nicht richtig zu Hause gebraut O mit (n ^ 3) Algorithmus, wenn ein O (n log n) Algorithmus in der Standardbibliothek ist. Es gibt auch Dinge wie Hand-Codierung Routinen, weil der Programmierer weiß nicht, was in der Standardbibliothek ist. Dass man ist sehr frustrierend.

Mit Design-Patterns nur haben sie verwendet wird.

  1. #defines statt Funktionen Mit der Strafe von einem Funktionsaufruf zu vermeiden. Ich habe Code gesehen, wo Erweiterungen definiert stellte sich heraus zu erzeugen, riesig und wirklich langsam Code. Natürlich war es auch zu debuggen unmöglich. Inline-Funktionen sind die Art und Weise, dies zu tun, aber sie sollten auch mit Vorsicht verwendet werden.

  2. Ich habe Code gesehen, in denen unabhängige Tests in Bits in einem Wort umgewandelt worden, die in einer switch-Anweisung verwendet werden kann. Switch kann sehr schnell sein, aber wenn die Leute eine Reihe von unabhängigen Tests in eine Bitmaske drehen und beginnt etwa 256 optimiert Sonderfälle Schreiben müssten sie besser eine sehr gute Benchmark beweist, dass dies eine Leistungssteigerung gibt. Es ist wirklich ein Schmerz Wartungs Sicht und macht die verschiedenen Tests Behandlung unabhängig den Code viel kleiner, die für die Leistung wichtig ist.

Der Mangel an klarer Programmstruktur ist die größte Code-Sünde von allen. Verschlungene Logik, die geglaubt wird, um schnell sein so gut wie nie ist.

nicht Refactoring oder optimieren, während das Schreiben von Code. Es ist extrem wichtig, nicht zu versuchen, Ihren Code zu optimieren, bevor Sie es zu beenden.

Julian Birch hat mir einmal gesagt:

„Ja, aber wie viele Jahre der Ausführung der Anwendung dauert es eigentlich für die Zeit von den Entwicklern tun es ausgegeben zu machen?“

Er wurde in die kumulativen Menge an Zeit, während jeder Transaktion durch eine Optimierung gespeichert bezieht, die eine bestimmte Menge an Zeit in Anspruch nehmen würde, zu implementieren.

Weise Worte aus der alten Weisen ... Ich denke oft an diesen Rat, wenn dabei eine flippige Optimierung berücksichtigen. Sie können den gleichen Begriff ein wenig weiter verlängern, indem man bedenkt, wie viel Entwicklungszeit in seinem gegenwärtigen Zustand ausgegeben wird mit dem Code zu tun im Vergleich zu wie viel Zeit von den Benutzern selbst gespeichert wird. Man könnte sogar die Zeit nach Stundensatz des Entwicklers gegenüber dem Gewicht des Benutzers, wenn man wollte.

Natürlich, manchmal es ist unmöglich zu messen, zum Beispiel, wenn eine E-Commerce-Anwendung 1 Sekunde länger zu reagieren führen Sie einig kleines% Geld von den Benutzern verlieren während dieser 1 Sekunde zu langweilen. Nachholen, dass eine Sekunde müssen Sie implementieren und halten optimierten Code. Die Optimierung Auswirkungen Rohertrag positiv und der Reingewinn negativ, so dass ihre viel schwerer zu balancieren. Sie könnten versuchen - mit guten Statistiken

.

Ausnutzen Programmiersprache. Dinge wie Ausnahme mit Handling statt, wenn / sonst nur weil in PLSnakish 1.4 es ist schneller. Erraten Sie, was? Die Chancen stehen gut, es ist nicht schneller überhaupt und dass zwei Jahre ab jetzt jemand den Code nicht einhalten, wirklich wütend auf Sie, weil Sie den Code verschleiert und machte es viel langsamer, laufen, weil in PLSnakish 1.8 die Sprache Maintainer das Problem behoben und jetzt, wenn / else ist 10-mal schneller als die Ausnahmebehandlung Tricks. Arbeit mit Ihre Programmiersprache und Rahmen!

Ändern mehr als eine Variable auf einmal. Das treibt mich absolut bonkers ! Wie kann man die Auswirkungen einer Änderung auf einem System bestimmen, wenn mehr als eine Sache hat sich verändert worden?

Damit verbunden, so dass Änderungen, die nicht durch Beobachtungen gerechtfertigt ist. Warum fügt schneller / CPUs, wenn der Prozess nicht CPU gebunden ist?

Allgemeine Lösungen .

Nur weil ein bestimmtes Muster / Technologie in einem Umstand zu besseren Ergebnissen führt, bedeutet nicht, es in einem anderen Fall ist.

Stringübernutzung in .NET ist ein häufiges Beispiel für diesen.

Sobald ich ein ehemaliger Kunde rufen Sie mich fragen, hatte für jeden Rat, den ich ihre Apps über die Beschleunigung hatte.

Er schien mich zu erwarten, Dinge zu sagen wie „X überprüft, dann Y überprüfen, dann überprüfen Z“, mit anderen Worten, Experten raten zur Verfügung zu stellen.

Ich antwortete, dass Sie das Problem zu diagnostizieren haben. Meine Vermutungen könnten falsch weniger oft als jemand anderes, aber sie würden immer noch falsch sein, und daher enttäuschend.

Ich glaube nicht, dass er verstanden wird.

Einige Entwickler glauben, dass eine schnell-but-falsche Lösung auf einen langsam aber korrigiert man manchmal vorzuziehen ist. So werden sie verschiedene Randbedingungen oder Situationen ignorieren, dass „wird nie passieren“ oder „keine Rolle“ in der Produktion.

Das ist nie eine gute Idee. Lösungen müssen immer „richtig“ sein.

Sie müssen Ihre Definition von „korrigieren“ in Abhängigkeit von der Situation anzupassen. Was wichtig ist, ist, dass Sie wissen / definieren genau, was Sie wollen das Ergebnis für jede Bedingung zu sein, und dass der Code gibt diese Ergebnisse.

Michael A Jackson gibt zwei Regeln für die Optimierung der Leistung:

  1. Tun Sie es nicht.
  2. (nur für Experten) Tun Sie es noch nicht.

Wenn die Menschen besorgt über die Leistung sind, sagen ihnen zu machen, real - was ist eine gute Leistung und wie testen Sie es? Dann, wenn Sie den Code ausführen up nicht auf ihre Standards, zumindest ist es etwas, was der Code Schriftsteller und die Anwendung Benutzer vereinbaren.

Wenn die Menschen sind besorgt über die Nichterfüllung Kosten von verknöchertem Code Umschreiben (zum Beispiel der Zeit, Waschbecken), dann Ihre Schätzungen präsentieren und zeigen, dass es in der Anlage durchgeführt werden kann. Unter der Annahme, es kann.

Ich glaube, es ist ein weit verbreiteter Mythos ist, dass Super-Mager-Code „in der Nähe des Metall“ performanter als ein elegantes Domänenmodell ist.

Dies wurde offenbar de-bunked vom Schöpfer / leitenden Entwickler von DirectX, die die C ++ Version in C # mit massiven Verbesserungen neu geschrieben. [Quelle erforderlich]

Anfügen an ein Array mit (zum Beispiel) push_back () in C ++ STL, ~ = in D usw., wenn Sie wissen, wie groß das Array sollen vor der Zeit sein und es vorab zuordnen kann.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top