Wir alle wissen, dass vorzeitige Optimierung die Wurzel allen Übels ist, weil sie zu unlesbarem / nicht wartbarem Code führt. Noch schlimmer ist die Pessimisierung, wenn jemand eine "Optimierung" implementiert, weil er glaubt , dass sie schneller sein wird, aber am Ende langsamer, fehlerhaft, nicht wartbar usw. Was ist das lächerlichste Beispiel dafür, das Sie gesehen haben ?
performance
optimization
Dsimcha
quelle
quelle
Antworten:
Bei einem alten Projekt haben wir einige (ansonsten ausgezeichnete) Programmierer für eingebettete Systeme geerbt, die über umfangreiche Erfahrung mit Z-8000 verfügten.
Unsere neue Umgebung war 32-Bit-Sparc Solaris.
Einer der Jungs hat alle Ints in Shorts geändert, um unseren Code zu beschleunigen, da das Abrufen von 16 Bit aus dem RAM schneller war als das Abrufen von 32 Bit.
Ich musste ein Demo-Programm schreiben, um zu zeigen, dass das Abrufen von 32-Bit-Werten auf einem 32-Bit-System schneller war als das Abrufen von 16-Bit-Werten, und erklären, dass die CPU zum Abrufen eines 16-Bit-Werts eine 32-Bit-Breite erstellen musste Speicherzugriff und dann Maskieren oder Verschieben der für den 16-Bit-Wert nicht benötigten Bits.
quelle
Ich denke, der Ausdruck "vorzeitige Optimierung ist die Wurzel allen Übels" wird weit überstrapaziert. Für viele Projekte ist es eine Ausrede geworden, die Leistung erst spät in einem Projekt zu berücksichtigen.
Dieser Satz ist oft eine Krücke für Menschen, um Arbeit zu vermeiden. Ich sehe diesen Satz verwendet, wenn die Leute wirklich sagen sollten: "Gee, wir haben wirklich nicht daran gedacht und haben jetzt keine Zeit, uns damit zu befassen."
Ich habe viel mehr "lächerliche" Beispiele für dumme Leistungsprobleme gesehen als Beispiele für Probleme, die aufgrund von "Pessimisierung" eingeführt wurden.
Was ich für eine bessere Aussage halte, ist folgende: "Optimierung ohne Messen und Verstehen ist überhaupt keine Optimierung - es ist nur eine zufällige Änderung".
Gute Leistung ist zeitaufwändig - oft mehr als die Entwicklung des Features oder der Komponente selbst.
quelle
Datenbanken sind Pessimierungsspielland.
Zu den Favoriten gehören:
Das ist mir ein Rätsel.
quelle
Ich denke, es gibt keine absolute Regel: Einige Dinge werden am besten im Voraus optimiert, andere nicht.
Ich habe zum Beispiel in einer Firma gearbeitet, in der wir Datenpakete von Satelliten erhalten haben. Jedes Paket hat viel Geld gekostet, daher wurden alle Daten stark optimiert (dh gepackt). Zum Beispiel wurde Breiten- / Längengrad nicht als Absolutwerte (Floats) gesendet, sondern als Offsets relativ zur "Nordwesten" -Ecke einer "aktuellen" Zone. Wir mussten alle Daten entpacken, bevor sie verwendet werden konnten. Aber ich denke, dies ist keine Pessimierung, sondern eine intelligente Optimierung, um die Kommunikationskosten zu senken.
Andererseits haben unsere Softwarearchitekten entschieden, dass die entpackten Daten in ein gut lesbares XML-Dokument formatiert und als solches in unserer Datenbank gespeichert werden sollten (im Gegensatz dazu, dass jedes Feld in einer entsprechenden Spalte gespeichert wird). Ihre Idee war, dass "XML die Zukunft ist", "Speicherplatz ist billig" und "Prozessor ist billig", so dass nichts optimiert werden musste. Das Ergebnis war, dass unsere 16-Byte-Pakete in 2-KB-Dokumente umgewandelt wurden, die in einer Spalte gespeichert waren, und dass wir selbst für einfache Abfragen Megabyte an XML-Dokumenten in den Speicher laden mussten! Wir haben über 50 Pakete pro Sekunde erhalten, sodass Sie sich vorstellen können, wie schrecklich die Leistung wurde (übrigens, das Unternehmen ging bankrott).
Es gibt also wieder keine absolute Regel. Ja, manchmal ist eine zu frühe Optimierung ein Fehler. Aber manchmal ist das Motto "CPU / Speicherplatz / Speicher ist billig" die wahre Wurzel allen Übels.
quelle
Oh mein Gott, ich glaube ich habe sie alle gesehen. Meistens ist es eine Anstrengung, Leistungsprobleme von jemandem zu beheben, der zu faul ist, um Fehler bis zur URSACHE dieser Leistungsprobleme zu beheben oder sogar zu untersuchen, ob tatsächlich ein Leistungsproblem vorliegt. In vielen dieser Fälle frage ich mich, ob es nicht nur darum geht, dass diese Person eine bestimmte Technologie ausprobieren möchte und verzweifelt nach einem Nagel sucht, der zu ihrem glänzenden neuen Hammer passt.
Hier ist ein aktuelles Beispiel:
Der Datenarchitekt kommt zu mir mit einem ausführlichen Vorschlag, eine Schlüsseltabelle in einer ziemlich großen und komplexen Anwendung vertikal zu partitionieren. Er möchte wissen, welche Art von Entwicklungsaufwand notwendig wäre, um sich auf die Veränderung einzustellen. Das Gespräch lief folgendermaßen ab:
Ich: Warum denkst du darüber nach? Was ist das Problem, das Sie lösen möchten?
Ihm: Tabelle X ist zu breit, wir partitionieren sie aus Leistungsgründen.
Ich: Warum denkst du, dass es zu breit ist?
Ihm: Der Berater sagte, das seien viel zu viele Spalten, um sie in einer Tabelle zu haben.
Ich: Und das wirkt sich auf die Leistung aus?
Ihm: Ja, Benutzer haben zeitweise Verlangsamungen im XYZ-Modul der Anwendung gemeldet.
Ich: Woher wissen Sie, dass die Breite der Tabelle die Ursache des Problems ist?
Ihm: Das ist die Schlüsseltabelle, die vom XYZ-Modul verwendet wird, und sie entspricht 200 Spalten. Es muss das Problem sein.
Ich (Erklären): Das Modul XYZ verwendet jedoch insbesondere die meisten Spalten in dieser Tabelle, und die verwendeten Spalten sind unvorhersehbar, da der Benutzer die App so konfiguriert, dass die Daten angezeigt werden, die aus dieser Tabelle angezeigt werden sollen. Es ist wahrscheinlich , dass 95% der Zeit würden wir alle die Tische wieder zusammen sowieso Verbindungs aufzuwickeln , was würde verletzt Leistung.
Ihm: Der Berater sagte, es sei zu breit und wir müssen es ändern.
Ich: Wer ist dieser Berater? Ich wusste nicht, dass wir einen Berater eingestellt haben, und sie haben überhaupt nicht mit dem Entwicklungsteam gesprochen.
Ihm: Nun, wir haben sie noch nicht eingestellt. Dies ist Teil eines Vorschlags, den sie angeboten haben, aber sie bestanden darauf, dass wir diese Datenbank neu gestalten müssen.
Ich: Ähhh. Der Berater, der Dienstleistungen zur Neugestaltung von Datenbanken verkauft, ist der Meinung, dass wir eine Neugestaltung der Datenbank benötigen.
Das Gespräch ging so weiter und weiter. Danach habe ich mir die fragliche Tabelle noch einmal angesehen und festgestellt, dass sie wahrscheinlich durch eine einfache Normalisierung eingegrenzt werden kann, ohne dass exotische Partitionierungsstrategien erforderlich sind. Dies stellte sich natürlich als strittiger Punkt heraus, als ich die Leistungsprobleme (zuvor nicht gemeldet) untersuchte und sie auf zwei Faktoren zurückführte:
Natürlich drängt der Architekt immer noch auf eine vertikale Aufteilung des Tisches, die am "zu breiten" Metaproblem festhält. Er unterstützte seinen Fall sogar, indem er einen Vorschlag von einem anderen Datenbankberater erhielt, der feststellen konnte, dass wir größere Designänderungen an der Datenbank benötigten, ohne auf die App zu schauen oder eine Leistungsanalyse durchzuführen.
quelle
Ich habe Leute gesehen, die Alphadrive-7 verwendeten, um CHX-LT vollständig zu inkubieren. Dies ist eine ungewöhnliche Praxis. Die üblichere Praxis besteht darin, den ZT-Transformator so zu initialisieren, dass die Pufferung verringert wird (aufgrund eines höheren Nettoüberlastungswiderstands) und Bytegraphien im Java-Stil zu erstellen.
Total pessimistisch!
quelle
Ich gebe zu, nichts Erderschütterndes, aber ich habe Leute erwischt, die StringBuffer verwenden, um Strings außerhalb einer Schleife in Java zu verketten. Es war so einfach wie sich zu drehen
in
Früher war es üblich, die Technik in einer Schleife anzuwenden, da sie messbar schneller war. Die Sache ist, StringBuffer ist synchronisiert, so dass es tatsächlich zusätzlichen Aufwand gibt, wenn Sie nur ein paar Strings verketten. (Ganz zu schweigen davon, dass der Unterschied auf dieser Skala absolut trivial ist.) Zwei weitere Punkte zu dieser Praxis:
quelle
Ich habe einmal eine MSSQL-Datenbank gesehen, die eine 'Root'-Tabelle verwendet hat. Die Root-Tabelle hatte vier Spalten: GUID (Uniqueidentifier), ID (Int), LastModDate (Datum / Uhrzeit) und CreateDate (Datum / Uhrzeit). Alle Tabellen in der Datenbank wurden mit einem Fremdschlüssel für die Root-Tabelle versehen. Wann immer eine neue Zeile in einer Tabelle in der Datenbank erstellt wurde, mussten Sie einige gespeicherte Prozeduren verwenden, um einen Eintrag in die Root-Tabelle einzufügen, bevor Sie zu der eigentlichen Tabelle gelangen konnten, die Ihnen wichtig war (und nicht zu der Datenbank, für die der Job ausgeführt wurde) Sie mit ein paar Auslösern einfache Auslöser).
Dies verursachte ein Durcheinander von nutzlosem Abhören und Kopfschmerzen, erforderte alles, was darüber geschrieben war, um Sprocs zu verwenden (und beseitigte meine Hoffnungen, LINQ in das Unternehmen einzuführen. Es war möglich, aber die Kopfschmerzen nicht wert), und um das Ganze abzurunden, tat es nicht. Ich kann nicht einmal das erreichen, was es tun sollte.
Der Entwickler, der diesen Pfad gewählt hat, hat ihn unter der Annahme verteidigt, dass dies viel Platz gespart hat, weil wir keine Guids für die Tabellen selbst verwendet haben (aber ... wird nicht für jede von uns erstellte Zeile eine GUID in der Root-Tabelle generiert?) , verbesserte irgendwie die Leistung und machte es "einfach", Änderungen an der Datenbank zu überwachen.
Oh, und das Datenbankdiagramm sah aus wie eine mutierte Spinne aus der Hölle.
quelle
Wie wäre es mit POBI - Pessimisierung offensichtlich absichtlich?
Mein Kollege in den 90er Jahren hatte es satt, vom CEO in den Arsch getreten zu werden, nur weil der CEO den ersten Tag jeder ERP-Software-Version (eine benutzerdefinierte) damit verbracht hatte, Leistungsprobleme in den neuen Funktionen zu lokalisieren. Selbst wenn die neuen Funktionen Gigabyte knirschten und das Unmögliche möglich machten, fand er immer ein Detail oder sogar ein scheinbar großes Problem, über das er jammern konnte. Er glaubte viel über das Programmieren zu wissen und bekam seine Tritte, indem er Programmierern in den Arsch trat.
Aufgrund der Inkompetenz der Kritik (er war ein CEO, kein IT-Mann) gelang es meinem Kollegen nie, es richtig zu machen. Wenn Sie kein Leistungsproblem haben, können Sie es nicht beseitigen ...
Bis zu einer Veröffentlichung hat er viele Delay (200) -Funktionsaufrufe (es war Delphi) in den neuen Code eingefügt. Es dauerte nur 20 Minuten nach der Inbetriebnahme, und er wurde angewiesen, im Büro des CEO zu erscheinen, um seine überfälligen Beleidigungen persönlich zu holen.
Bisher war es nur ungewöhnlich, dass meine Kollegen stumm waren, als er zurückkam, lächelte, scherzte, ein oder zwei BigMacs ausging, während er normalerweise gegen Tische trat, über den CEO und das Unternehmen flammte und den Rest des Tages zu Tode verbrachte .
Natürlich ruhte sich mein Kollege jetzt ein oder zwei Tage an seinem Schreibtisch aus und verbesserte seine Zielfähigkeiten in Quake. Am zweiten oder dritten Tag löschte er die Verzögerungsaufrufe, baute sie neu auf und veröffentlichte einen "Notfall-Patch", von dem er das Wort verbreitete dass er 2 Tage und 1 Nacht verbracht hatte, um die Leistungslöcher zu reparieren.
Dies war das erste (und einzige) Mal, dass der böse CEO "großartige Arbeit!" Sagte. zu ihm. Das ist alles was zählt, oder?
Das war echtes POBI.
Es ist aber auch eine Art Optimierung sozialer Prozesse, also 100% in Ordnung.
Meiner Ansicht nach.
quelle
"Datenbankunabhängigkeit". Dies bedeutete keine gespeicherten Prozesse, Trigger usw. - nicht einmal Fremdschlüssel.
quelle
Beste Verwendung eines StringBuilder, den ich je gesehen habe.
quelle
Verwenden eines regulären Ausdrucks zum Teilen eines Strings, wenn ein einfacher string.split ausreicht
quelle
Sehr spät zu diesem Thread weiß ich, aber ich habe das kürzlich gesehen:
Weißt du, nur für den Fall, dass ein Boolescher Wert einige zusätzliche Werte hat ...
quelle
Das schlechteste Beispiel, das ich mir vorstellen kann, ist eine interne Datenbank in meinem Unternehmen, die Informationen zu allen Mitarbeitern enthält. Es erhält ein nächtliches Update von HR und verfügt über einen ASP.NET-Webdienst. Viele andere Apps verwenden den Webdienst, um beispielsweise Such- / Dropdown-Felder zu füllen.
Der Pessimismus besteht darin, dass der Entwickler der Meinung war, dass wiederholte Aufrufe des Webdienstes zu langsam wären, um wiederholte SQL-Abfragen durchzuführen. Also, was hat er getan? Das Anwendungsstartereignis liest die gesamte Datenbank ein und konvertiert alles in Objekte im Speicher, die unbegrenzt gespeichert werden, bis der App-Pool wiederverwendet wird. Dieser Code war so langsam, dass das Laden von weniger als 2000 Mitarbeitern 15 Minuten dauern würde. Wenn Sie den App-Pool tagsüber versehentlich recycelt haben, kann dies 30 Minuten oder länger dauern, da bei jeder Webdienstanforderung mehrere gleichzeitige Neuladungen gestartet werden. Aus diesem Grund würden neue Mitarbeiter am ersten Tag der Kontoerstellung nicht in der Datenbank angezeigt und könnten daher in den ersten Tagen nicht auf die meisten internen Apps zugreifen und mit den Daumen drehen.
Die zweite Stufe des Pessimismus besteht darin, dass der Entwicklungsmanager ihn nicht berühren möchte, weil er befürchtet, abhängige Anwendungen zu beschädigen. Dennoch kommt es aufgrund des schlechten Designs einer so einfachen Komponente weiterhin zu sporadischen unternehmensweiten Ausfällen kritischer Anwendungen.
quelle
Niemand scheint das Sortieren erwähnt zu haben, also werde ich es tun.
Ich habe mehrmals festgestellt, dass jemand einen Bubblesort von Hand hergestellt hat, weil die Situation keinen Aufruf des bereits existierenden "zu ausgefallenen" Quicksort-Algorithmus "nicht erforderte". Der Entwickler war zufrieden, als sein handgefertigter Bubblesort gut genug für die zehn Datenzeilen funktionierte, die er zum Testen verwendet. Es ging nicht ganz so gut, nachdem der Kunde ein paar tausend Zeilen hinzugefügt hatte.
quelle
Ich habe einmal an einer App gearbeitet, die voller Code war:
Einfach entfernen
found
,null
am Ende zurückkehren und die sechste Zeile ändern in:Verdoppelte die App-Leistung.
quelle
Ich musste einmal versuchen, Code zu ändern, der diese Edelsteine in der Constants-Klasse enthielt
Jedes davon wurde im Rest der Anwendung mehrfach für unterschiedliche Zwecke verwendet. COMMA_DELIMINATOR hat den Code mit über 200 Verwendungen in 8 verschiedenen Paketen übersät.
quelle
Die große Nummer eins aller Zeiten, die mir in der Inhouse-Software immer wieder begegnet:
Die Funktionen des DBMS werden aus Gründen der "Portabilität" nicht verwendet, da "wir später möglicherweise zu einem anderen Anbieter wechseln möchten".
Lies meine Lippen. Für jede Inhouse-Arbeit: ES PASSIERT NICHT!
quelle
Ich hatte einen Kollegen, der versuchte, den Optimierer unseres C-Compilers zu überlisten und routinemäßig Code neu zu schreiben, den nur er lesen konnte. Einer seiner Lieblingstricks war das Ändern einer lesbaren Methode wie (Code erstellen):
das mögen:
Das heißt, die erste Zeile einer einmal lesbaren Methode würde "
return
" werden und jede andere Logik würde durch tief verschachtelte terniäre Ausdrücke ersetzt. Wenn Sie darüber streiten wollten, dass dies nicht wartbar ist, hat er darauf hingewiesen, dass die Montageausgabe seiner Methode drei oder vier Montageanweisungen kürzer war. Es war nicht unbedingt schneller, aber es war immer winzig bisschen kürzer. Dies war ein eingebettetes System, bei dem die Speichernutzung gelegentlich eine Rolle spielte, aber es gab weitaus einfachere Optimierungen, die vorgenommen werden konnten, als dies, was den Code lesbar gemacht hätte.Danach entschied er aus irgendeinem Grund, dass dies
ptr->structElement
zu unlesbar sei, und begann, all dies in(*ptr).structElement
die Theorie umzuwandeln, dass es auch lesbarer und schneller sei.Lesen von lesbarem Code in unlesbaren Code für höchstens 1% Verbesserung und manchmal sogar langsameren Code.
quelle
if
. Beharren auf Aussagen über Ausdrücke in C ist es, kulturelle / religiöse Dogma, nicht jede Art von Ziel Praxis. (Bessere Richtlinie: Wenn das verschachtelte Ternär zu lang zum Lesen ist, sollten Sie es auch nicht verwendenif
.)if
Funktion zu übernehmen und durch eine ternäre zu ersetzen. Das ist in Ordnung und oft besser lesbar. Ich spreche über das Ersetzen einer Methode mit mehr als 30 Zeilen durch eine einzelne return-Anweisung und verschachtelte ternäre. Niemand dachte, der neue Code sei besser lesbar, aber ein Entwickler dachte, er sei schneller.In einem meiner ersten Jobs als vollwertiger Entwickler übernahm ich ein Projekt für ein Programm, bei dem Skalierungsprobleme auftraten. Es würde bei kleinen Datenmengen recht gut funktionieren, bei großen Datenmengen jedoch vollständig abstürzen.
Als ich mich vertiefte, stellte ich fest, dass der ursprüngliche Programmierer versuchte, die Dinge durch Parallelisierung der Analyse zu beschleunigen - indem er für jede zusätzliche Datenquelle einen neuen Thread startete. Er hatte jedoch einen Fehler gemacht, da für alle Threads eine gemeinsame Ressource erforderlich war, für die sie festgefahren waren. Natürlich sind alle Vorteile der Parallelität verschwunden. Darüber hinaus stürzten die meisten Systeme ab, um mehr als 100 Threads zu starten, nur um alle bis auf einen zu sperren. Meine bullige Entwicklungsmaschine war insofern eine Ausnahme, als sie in etwa 6 Stunden einen Datensatz mit 150 Quellen durchlief.
Um das Problem zu beheben, habe ich die Multithreading-Komponenten entfernt und die E / A bereinigt. Ohne weitere Änderungen fiel die Ausführungszeit für das 150-Quellen-Dataset auf meinem Computer unter 10 Minuten und auf dem durchschnittlichen Unternehmenscomputer von unendlich auf unter eine halbe Stunde.
quelle
Ich nehme an, ich könnte dieses Juwel anbieten:
Da die Quadratwurzel an einer sehr empfindlichen Stelle berechnet wurde, hatte ich die Aufgabe, nach einer Möglichkeit zu suchen, sie schneller zu machen. Dieses kleine Refactoring reduzierte die Ausführungszeit um ein Drittel (für die Kombination aus Hardware und verwendetem Compiler YMMV):
Natürlich gibt es sowohl schnellere als auch bessere Möglichkeiten, dies zu tun, aber ich denke, es ist ein ziemlich gutes Beispiel für eine Pessimierung.
Edit: Kommen Sie und denken Sie darüber nach, die abgewickelte Schleife war eigentlich auch eine ordentliche Pessimisierung. Durch die Versionskontrolle kann ich auch die zweite Phase des Refactorings vorstellen, die sogar noch besser abschnitt als die oben genannten:
Dies ist genau der gleiche Algorithmus, wenn auch eine etwas andere Implementierung, also nehme ich an, dass er qualifiziert ist.
quelle
isqrt()
berechnetfloor(sqrt())
, aber warum funktioniert dieser Code?Dies kann auf einem höheren Niveau sein als das, wonach Sie gesucht haben, aber das Reparieren (wenn Sie erlaubt sind) beinhaltet auch ein höheres Maß an Schmerz:
Bestehen Sie darauf, einen Object Relationship Manager / eine Datenzugriffsschicht zu verwenden, anstatt eine der etablierten, getesteten und ausgereiften Bibliotheken zu verwenden (auch nachdem Sie darauf hingewiesen wurden).
quelle
Alle Fremdschlüsseleinschränkungen wurden aus einer Datenbank entfernt, da sonst so viele Fehler auftreten würden.
quelle
Das passt nicht genau zu der Frage, aber ich werde es trotzdem als warnende Geschichte erwähnen. Ich arbeitete an einer verteilten App, die langsam lief, und flog nach DC, um an einem Meeting teilzunehmen, das in erster Linie auf die Lösung des Problems abzielte. Der Projektleiter begann, eine Neuarchitektur zu skizzieren, um die Verzögerung zu beheben. Ich meldete mich freiwillig, dass ich am Wochenende einige Messungen vorgenommen hatte, die den Engpass auf eine einzige Methode isolierten. Es stellte sich heraus, dass bei einer lokalen Suche ein Datensatz fehlte, sodass die Anwendung bei jeder Transaktion zu einem Remote-Server wechseln musste. Durch Hinzufügen des Datensatzes zum lokalen Speicher wurde die Verzögerung beseitigt - Problem gelöst. Beachten Sie, dass die Neuarchitektur das Problem nicht behoben hätte.
quelle
Überprüfen Sie vor JEDER Javascript-Operation, ob das Objekt, mit dem Sie arbeiten, vorhanden ist.
Mein Problem mit dieser Art von Code ist, dass es niemanden zu interessieren scheint, was passiert, wenn er nicht existiert? Einfach nichts tun? Geben Sie dem Benutzer kein Feedback?
Ich bin damit einverstanden, dass die
Object expected
Fehler ärgerlich sind, aber dies ist nicht die beste Lösung dafür.quelle
Wie wäre es mit YAGNI Extremismus. Es ist eine Form der vorzeitigen Pessimisierung. Es scheint, als ob Sie YAGNI jedes Mal, wenn Sie es anwenden, benötigen, was zu einem 10-fachen Aufwand beim Hinzufügen führt, als wenn Sie es am Anfang hinzugefügt hätten. Wenn Sie ein erfolgreiches Programm erstellen, werden Sie es wahrscheinlich brauchen. Wenn Sie es gewohnt sind, Programme zu erstellen, deren Leben schnell abläuft, dann üben Sie weiterhin YAGNI, denn dann nehme ich an, YAGNI.
quelle
Nicht gerade vorzeitige Optimierung - aber sicherlich falsch - wurde auf der BBC-Website aus einem Artikel über Windows 7 gelesen.
Jetzt habe ich Windows 7 noch nicht ausprobiert, daher kann ich mich irren, aber ich bin bereit zu wetten, dass es andere Probleme gibt, die wichtiger sind als die Zeit, die zum Herunterfahren benötigt wird. Wenn ich die Meldung "Windows herunterfahren" sehe, wird der Monitor ausgeschaltet und ich gehe weg - wie profitieren mich diese 400 Millisekunden?
quelle
Jemand in meiner Abteilung hat einmal eine String-Klasse geschrieben. Eine Schnittstelle wie
CString
, aber ohne die Windows-Abhängigkeit.Eine "Optimierung", die sie machten, war zu nicht mehr Speicher als nötig zuzuweisen. Anscheinend nicht erkannt, dass Klassen wie
std::string
überschüssigen Speicher zuweisen, ist, dass eine Folge von+=
Operationen in O (n) Zeit ausgeführt werden kann.Stattdessen erzwang jeder einzelne
+=
Aufruf eine Neuzuweisung, die wiederholte Anhänge in einen O (n²) Schlemiel the Painter-Algorithmus verwandelte .quelle
Ein ehemaliger Mitarbeiter von mir ( eigentlich ein Soab ) wurde beauftragt, ein neues Modul für unser Java-ERP zu erstellen, das Kundendaten hätte sammeln und analysieren sollen (Einzelhandel). Er beschloss, JEDES Kalender- / Datums- / Uhrzeitfeld in seine Komponenten (Sekunden, Minuten, Stunden, Tag, Monat, Jahr, Wochentag, Bimester, Trimester (!)) Aufzuteilen, weil "wie sonst würde ich nach 'jedem Montag' fragen?"
quelle
Keine Beleidigung für irgendjemanden, aber ich habe gerade eine Aufgabe (Java) bewertet, die dies hatte
quelle