Wofür optimieren Sie? [geschlossen]


19

Auf welche Art von Optimierungen neigen Sie sich im Allgemeinen beim Entwerfen von Software?

Sind Sie der Typ, für den Sie Ihr Design optimieren möchten?

  • Entwicklungszeit (dh schnell zu schreiben und / oder einfacher zu warten)?
  • Bearbeitungszeit
  • Speicherplatz (RAM, DB, Disc usw.)

Dies ist natürlich sehr subjektiv in Bezug auf die Art der zu lösenden Probleme und die damit verbundenen Fristen. Ich würde gerne mehr über die Gründe erfahren, aus denen Sie eine Form der Optimierung einer anderen vorziehen würden.


Alle drei der oben genannten, aber ich möchte allgemein werfen (was die Wartung betrifft). Wenn Sie sich Zeit nehmen, um beispielsweise eine wirklich effiziente Datenstruktur zu entwerfen, die weitgehend auf die Anforderungen Ihrer Software zugeschnitten ist, und diese gründlich testen, können Sie jahrelang damit arbeiten und müssen nicht mehr Datenstrukturen schreiben, die sich nur für die Lösung individueller Probleme eignen Probleme.

Antworten:


40

Instandhaltung

Anschließend ggf. profilieren und auf Geschwindigkeit optimieren. Ich hatte selten einen Speicherbedarf - zumindest in den letzten 10 Jahren nicht. Vorher habe ich getan.


8
+1, wenn Sie für die Wartbarkeit optimieren, ist es später einfacher, die Geschwindigkeit oder die Speicherung zu optimieren, wenn dies erforderlich ist.
Carson63000

Sie müssen immer noch mindestens die Verarbeitungszeit und den Speicher berücksichtigen , damit Sie keinen extrem übermäßigen Ansatz wählen.

@ Thorbjørn, wenn Sie die Entwicklerzeit optimieren, würden Sie wahrscheinlich (mehr als wahrscheinlich) die Algorithmen auswählen, die in einer bestimmten Sprache leichter zu lesen / schreiben sind. Erst später und nur, wenn die Leistung zum Problem wird, würden Sie beide (wie @Tim sagte) einen Profiler auswählen.
Jason Whitehorn

@ Jason, ich stimme überhaupt nicht zu. Sie sollten mit den Leistungsmerkmalen der von Ihnen ausgewählten Algorithmen vertraut sein, damit Sie eine geeignete Implementierung auswählen können. Das heißt, Sie wählen eine ArrayList, wenn Sie sie hauptsächlich für die Suche nach Postleitzahlen benötigen.

1
@ Thorbjørn, ich stimme dir nicht zu. Tatsächlich denke ich, dass Sie darin richtig sind, dass den vorliegenden Algorithmen Aufmerksamkeit geschenkt werden sollte. Ich denke jedoch, dass wir uns in der Meinung unterscheiden, dass die Idee, welche Algorithmen wir wählen sollen, meiner Meinung nach etwas ist, das durch Erfahrung gelernt und nur dann behoben wird, wenn sich ein Problem ergibt. Sie haben Recht, ich sehe nur keinen Optimierungsbedarf auf Kosten von weniger lesbarem / längerem Code.
Jason Whitehorn

27

Entwicklungszeit

Verarbeitung und Lagerung sind billig. Deine Zeit ist nicht.

Nur zu beachten:

Das bedeutet nicht, dass Sie schlecht Code schreiben müssen, um ihn schnell zu beenden. Es bedeutet, den Code so zu schreiben, dass eine schnelle Entwicklung möglich ist. Es hängt auch ganz von Ihren Anwendungsfällen ab. Wenn es sich um eine einfache, zwei- oder dreiseitige Website mit einem Kontaktformular handelt, müssen Sie wahrscheinlich kein PHP-Framework verwenden. Ein paar Includes und ein Mailer-Skript beschleunigen die Entwicklung. Wenn Sie stattdessen eine flexible Plattform erstellen möchten, auf der Sie wachsen und neue Funktionen hinzufügen können, lohnt es sich, sich die Zeit zu nehmen, sie richtig zu gestalten und entsprechend zu codieren, da dies die zukünftige Entwicklung beschleunigen wird.

Im direkten Vergleich zu Verarbeitungszeit und Lagerung neige ich zu einer schnelleren Entwicklungszeit. Ist die Verwendung der Subtraktionsfunktion collectionutils die schnellste und speichereffizienteste Methode zum Subtrahieren von Sammlungen? Nein! Aber es ist eine schnellere Entwicklungszeit. Wenn Sie auf Performance- oder Speicherengpässe stoßen, können Sie diese später beheben. Optimieren, bevor Sie wissen, was optimiert werden muss, ist eine Verschwendung Ihrer Zeit, und genau dafür plädiere ich.


4
Moores Gesetz endete vor ungefähr zwei Jahren. Es könnte an der Zeit sein, über Parallelität nachzudenken und diese zusätzlichen Kerne zu verwenden. Nur so erhalten Sie in Zukunft günstige Taktzyklen.
Robert Harvey

3
Um richtig zu sein, das Moore'sche Gesetz ist immer noch weit verbreitet: Ungefähr alle zwei Jahre verdoppelt sich die Anzahl der Transistoren auf einem Chip, was die Platzierung mehrerer Kerne auf einem einzigen Chip ermöglicht. Was geendet hat, ist das "freie Mittagessen" mit einer ständig steigenden Anzahl von Zyklen pro Sekunde.
Dominique McDonnell

1
"Verarbeitung und Lagerung sind billig." CPU-Cache und die Busgeschwindigkeit sind es nicht. Sie sind heute die wichtigsten Leistungsengpässe.
Mojuba

3
Dem stimme ich voll und ganz zu. Durch das Verwalten von lesbarem Code, die Verwendung geeigneter Tools für die jeweilige Aufgabe und das Einhalten der vereinbarten Unternehmensstandards wird die Zeit, die Sie für das Eingeben von Code in einen Computer benötigen, erheblich verkürzt und Ihrem Unternehmen eine Menge Geld gespart. Sie verbringen mehr Zeit mit Engineering als mit Tippen.
Matt DiTrolio

1
@Bill: Oder wenn Sie eingebettet arbeiten, wo Sie möglicherweise strenge Grenzwerte haben, die die Produktkosten erheblich erhöhen, wenn Sie diese überschreiten. Manchmal auch für Server-Software - wenn jemand die Verarbeitung auf Google-Servern um 1% verbessern könnte, wären das erhebliche Einsparungen.
David Thornley

12

Benutzererfahrung.

Dies ist der einzige Wert, der für Ihren Kunden von Bedeutung ist.

Entwicklungszeit ist weniger wichtig. Ich kann eine voll funktionsfähige Befehlszeilenanwendung viel schneller als eine GUI schreiben, aber wenn Mrs. Jane nicht herausfindet, wie sie Berichte ausspucken kann, die sie will, ist das nutzlos.

Wartung ist weniger wichtig. Ich kann eine Wippe sehr schnell reparieren, aber wenn sie mitten in einem Wald liegt, können Benutzer sie nicht finden.

Verarbeitungszeit ist weniger wichtig. Wenn ich ein Auto herstelle, das in 60 Sekunden auf Lichtgeschwindigkeit 0 geht, können Benutzer nicht lenken.

Ästhetik ist weniger wichtig. Ich kann eine Mona Lisa malen, aber wenn sie sich hinter einer Mauer versteckt, kann sie niemand sehen.

User Experience ist der einzige Wert, der zählt. Die ultimative Leistung besteht darin, eine Anwendung zu erstellen, die genau das tut, was der Benutzer erwartet.


Entschuldigung Joeri, ich wurde irgendwie in meine Bearbeitung mitgerissen.
Malfist

Es ist ein Community-Wiki für etwas, oder? ;)
Joeri Sebrechts

8

Es gibt nur eine Sache zu optimieren und es ist:

Was Ihre Kunden wollen

Benötigen Ihre Kunden das schnellste Programm? Auf Geschwindigkeit optimieren.

Benötigen Ihre Kunden absolute Zuverlässigkeit? Optimieren Sie dafür.

Müssen sie es morgen liefern, oder wird es unbrauchbar sein? Optimieren Sie die Entwicklungsgeschwindigkeit.

Laufen Sie auf einem unglaublich kleinen Gerät mit eingeschränkten Ressourcen? Optimieren Sie für diese Ressourcen.


Der einzige Haken ist, dass sie oft nicht wissen, was sie wollen oder Erwartungen haben, was möglich oder hilfreich ist.
Tim Williscroft

1
Und wenn diese Reihe von Multiple-Choice-Fragen gestellt wird, hört man meistens einfach "Ja" :-)
Jason Whitehorn

1
Ich habe nicht gesagt, dass es einfach ist. Und zumindest wenn Sie danach fragen, besteht die Möglichkeit, dass Sie eine nützliche Antwort erhalten.
DJClayworth

5

Bearbeitungszeit

Die Zeit meines Benutzers ist nicht billig. Was herumkommt, geht herum.


Ich habe gerade eine Anwendung aktualisiert, die ich letztes Jahr verwende. Sie hatten die App komplett neu geschrieben, und Junge, es war langsam. Ich musste endlich einen neuen Computer kaufen, um ihn schnell laufen zu lassen. Ich garantiere Ihnen, dass das nicht billig war, aber meine Zeit ist wertvoller.


Interessanter Blick auf die Bearbeitungszeit. Möchten Sie mitteilen, welche Art von Anwendungen Sie entwickeln? Ich bin fasziniert.
Jason Whitehorn

1
Die Verarbeitungszeit ist wichtig, wenn Sie auf vielen Computern ausgeführt werden. Wenn Sie beispielsweise die Wahl haben, zwei Monate länger für die Optimierung oder ein Upgrade von 10.000 PCs auf neuere Hardware zu verwenden, wird die Zeit des Entwicklers nicht ausreichen. Aber natürlich ist es ein Kompromiss. Wenn Sie nur auf einem halben Dutzend Servern arbeiten, gewinnt die Zeit des Entwicklers in diesem Fall wahrscheinlich an Bedeutung.
Dean Harding

1
@Jason, ich habe es gerade leicht und arbeite mit Excel und VBA in einem Konglomerat von Tabellenkalkulationen (die ich schnell komprimiert habe). Meine Benutzer arbeiten im Nebenzimmer und informieren mich, wenn ich Probleme habe. Meine Perspektive ergibt sich aus der Verwendung von Computern seit dreißig Jahren, und ich sehe zu, wie die Anwendungen immer wieder aufgebläht werden, wodurch Upgrades nur zu kompensiert werden. Ich weiß, dass Entwickler bessere Ergebnisse erzielen können. Sie müssen sich nur daran gewöhnen, effizienten Code zu schreiben.

+10 für den effizienten Code. Das wird gerade bei der modularen Programmierung viel zu oft übersehen. Jedes Modul läuft mit einer angemessenen Geschwindigkeit, aber die Summe aller kann entsetzlich langsam sein.
Joris Meys

4

Ich tendiere dazu, den Speicherverbrauch und die Speicherzuweisungen zu begrenzen. Ich weiß, es ist alte Schule, aber:

  • Der meiste Nicht-Wegwerf-Code, den ich schreibe, ist stark parallel. Dies bedeutet, dass eine übermäßige Speicherzuweisung und Speicherbereinigungsaktivität eine Menge ansonsten parallelisierbaren Codes serialisiert. Dies bedeutet auch, dass es viele Konflikte um einen gemeinsam genutzten Speicherbus geben wird.
  • Meine Hauptsprache ist D, das noch keine gute 64-Bit-Unterstützung hat (obwohl dies behoben wird).
  • Ich arbeite regelmäßig mit relativ großen Datensätzen.

+1 für die Arbeit, um Bloatware zu verhindern. Memory-Hogging-Programme sind schlechte Programme.

Memory-Hogging-Programme können im Großen und Ganzen auf 64-Bit-Systemen ausgeführt werden. Das haben wir getan, als eine unserer Apps auf Speicherprobleme stieß (sie verbraucht zu Recht viel Speicher). Der erste Punkt ist wichtig, wenn Leistung ist.
David Thornley

2

Ich würde sagen, ich optimiere in Richtung Effizienz, wobei Effizienz als Kompromiss zwischen Entwicklungszeit, zukünftiger Wartbarkeit, Benutzererfahrung und Ressourcenverbrauch definiert wird. Als Entwickler müssen Sie all diese Dinge unter einen Hut bringen, um ein Gleichgewicht zu halten.

Wie erreichen Sie dieses Gleichgewicht? Zunächst müssen Sie einige Konstanten festlegen, z. B. die Frist, die Hardware, auf der Ihre Anwendung ausgeführt wird, und die Art der Person, die sie verwendet. Ohne diese zu kennen, können Sie nicht das richtige Gleichgewicht herstellen und Prioritäten setzen, wo dies erforderlich ist.

Wenn Sie beispielsweise eine Serveranwendung auf einem leistungsstarken Computer entwickeln, möchten Sie möglicherweise die Leistungseffizienz abwägen, um sicherzustellen, dass Sie einen unbeweglichen Termin einhalten. Wenn Ihr Entwickler jedoch eine Anwendung entwickelt, die schnell auf Benutzereingaben reagieren muss (z. B. ein Videospiel), müssen Sie Ihre Eingaberoutine priorisieren, um sicherzustellen, dass sie nicht verzögert wird.


2

Welche Virtualisierungstechnologie auch immer ich verwende

Erinnern Sie sich noch an die Zeiten, als Systeme mit mehr als 512 MB RAM als Vorreiter galten? Ich verbringe meine Tage damit, Code für den Prior zu schreiben.

Ich arbeite hauptsächlich mit Low-Level-Programmen, die in der privilegierten Domäne in einer Xen-Umgebung ausgeführt werden. Unsere Obergrenze für die privilegierte Domain beträgt 512 MB, so dass der Rest des Arbeitsspeichers für unsere Kunden frei ist. Es ist auch typisch für uns, die privilegierte Domäne auf nur einen CPU-Kern zu beschränken.

Hier schreibe ich also Code, der auf einem brandneuen 6-KB-Server ausgeführt wird, und jedes Programm muss (idealerweise) innerhalb einer 100-KB-Obergrenze funktionieren oder die dynamische Speicherzuweisung vollständig vermeiden.

Ich optimiere konkret für:

  • Speicherbedarf
  • Sortierungen (wo der Großteil meines Codes die meiste Zeit verbringt)

Ich muss auch extrem fleißig sein, wenn es darum geht, auf Schlösser zu warten, auf E / A zu warten oder nur allgemein zu warten. Ein beträchtlicher Teil meiner Zeit fließt in die Verbesserung vorhandener nicht blockierender Socket-Bibliotheken und in die Erforschung praktischerer Methoden zur sperrenfreien Programmierung.

Jeden Tag finde ich es etwas ironisch, dass ich Code wie vor 15 Jahren auf Systemen schreibe, die im letzten Monat aufgrund von technologischen Fortschritten gekauft wurden.

Dies ist typisch für alle, die auch auf eingebetteten Plattformen arbeiten, obwohl selbst viele über mindestens 1 GB verfügen. Wie Jason betont, ist es auch typisch, wenn Programme geschrieben werden, die auf mobilen Geräten ausgeführt werden sollen. Die Liste geht weiter, Kioske, Thin Clients, Bilderrahmen, etc ..

Ich beginne zu denken, dass Hardware-Einschränkungen Programmierer wirklich von Leuten trennen, die etwas zum Laufen bringen können, ohne sich darum zu kümmern, was es tatsächlich verbraucht. Ich mache mir Sorgen darüber, welche Sprachen, die Typ und Gedächtnis vollständig abstrahieren und in den Pool des gesunden Menschenverstandes einfließen, der von Programmierern verschiedener Disziplinen geteilt wurde.


1
+1 für den Speicherfußdruckwinkel. Ich habe noch nie gegen die besonderen Einschränkungen kodiert, mit denen Sie es zu tun haben, aber entfernen Sie den ersten Abschnitt, in dem es um Xen geht, und ersetzen Sie ihn durch das iPhone. Ich weiß genau, woher Sie kommen :-)
Jason Whitehorn

2

Forschungsergebnisse

Als Akademiker dachte ich mir, ich sollte teilen, wofür ich optimiere. Beachten Sie, dass dies nicht mit der Optimierung für eine kürzere Entwicklungszeit identisch ist. Häufig bedeutet dies, dass die Arbeit möglicherweise eine Forschungsfrage unterstützt, jedoch kein zu lieferndes, poliertes Produkt ist. Dies könnte als Qualitätsproblem angesehen werden, und es könnte erklären, warum viele sagen, dass (akademische) Informatiker keine Erfahrung in der "realen Welt" haben. (ZB "Würden sie sonst nicht wissen, wie man ein lieferbares Produkt entwickelt?" )

Es ist eine feine Linie. In Bezug auf die Wirkung möchten Sie, dass Ihre Arbeit von anderen verwendet und zitiert wird, und Joels Eisberg-Effekt kommt ins Spiel: Ein wenig Glanz und Glanz kann viel bewirken. Wenn Sie jedoch keine Grundlage für weitere Projekte schaffen, auf denen Sie aufbauen können, können Sie möglicherweise nicht die Zeit rechtfertigen, die für die Erstellung eines zu liefernden Produkts aufgewendet wurde.


1
  1. Design
    • niedrige Kupplung, modular
    • prägnante, klar definierte Funktionsbereiche
    • gut dokumentiert
    • kontinuierlich refactor für cruft
  2. Wartung
    • reproduzierbar bauen und debuggen
    • Unit-Tests
    • Regressionstests
    • Quellcodeverwaltung

... danach alles andere

... endlich auf Leistung optimieren ;-)


1

Qualität / Prüfung

Optimieren Sie die Qualität, indem Sie sicherstellen, dass im Entwicklungsplan Zeit für das Testen vorhanden ist, sowohl für das Testen von Einheiten als auch für das Testen nach Funktionen / Phasen.


1

Dies hängt von den Anforderungen Ihres Programms ab.

Das meiste, was ich mache, ist stark von der Verarbeitungskapazität und dem Arbeitsspeicher abhängig, durchläuft jedoch nicht viele, wenn überhaupt, signifikante Veränderungen im durchschnittlichen Jahr.

Ich habe in der Vergangenheit an Projekten gearbeitet, bei denen der Code häufig geändert wird, damit die Wartbarkeit in diesen Fällen an Bedeutung gewinnt.

Ich habe in der Vergangenheit auch an Systemen gearbeitet, bei denen die Datenmenge das bedeutendste Problem darstellt, selbst bei der Speicherung auf der Festplatte. Die Größe wird jedoch häufiger zu einem Problem, wenn Sie die Daten viel oder nur langsam verschieben müssen Verknüpfung.


1

Eleganz .

Wenn Ihr Code gut entworfen ist, hat er mehrere Auswirkungen:

  1. Es wird einfacher zu warten sein (Kostensenkung für den Kunden)
  2. Es wird einfacher zu optimieren sein (für JIT oder Full Compiler)
  3. Es wird einfacher zu ersetzen sein (wenn Sie an eine bessere Lösung denken)


0

Da ich Installationen auf mehreren Systemtypen durchführe, von IBM Mainframe bis hin zu PCs, optimiere ich zuerst die Kompatibilität, dann die Größe und dann die Geschwindigkeit.


0

Es hängt davon ab, ob

Wenn Sie an einem eingebetteten Echtzeit-Videoverarbeitungssystem arbeiten, optimieren Sie die Verarbeitungsgeschwindigkeit. Wenn Sie an einem Textverarbeitungsprogramm arbeiten, optimieren Sie die Entwicklungszeit.

In jedem Fall muss Ihr Code jedoch funktionieren und wartbar sein.


0

Ausdruck meiner Absicht.

Ich möchte, dass jemand, der meinen Code liest, auf einfache Weise erkennt, welche Vorgänge ich in der Domäne aufgerufen habe. Ebenso versuche ich, nicht-semantischen Junk (geschweifte Klammern, Funktionsschlüsselwörter in js usw.) zu minimieren, um das Scannen zu vereinfachen.

Natürlich muss man das durch Wartbarkeit ausgleichen. Ich liebe es, Funktionen zu schreiben, die Funktionen und alle möglichen fortgeschrittenen Techniken zurückgeben, und sie fördern mein Ziel, aber wenn der Nutzen gering ist, werde ich mich auf die Seite von Techniken beschränken, mit denen solide jr-Programmierer vertraut wären.


-6

Alle von ihnen

Bearbeitungszeit

Die heutigen Computer sind schnell, aber bei weitem nicht genug. In vielen Situationen ist die Leistung entscheidend - wenn Sie Medienserver streamen.

Lager

Ihr Kunde hat möglicherweise eine große Festplatte, z. B. 1 TB. Welche können von 1000 HD-Filmen aufgenommen werden, wenn Sie es zu einem Dienst machen wollen, ist es bei weitem nicht genug, nicht wahr?

Entwicklungszeit

Nun, ich bin mir nicht sicher, ob dies als "Optimierung" gilt. Ich verwende Java anstelle von C ++ und die Entwicklung wird 10-mal schneller Vorwärts und total rockig!

BTW Ich glaube, um die Entwicklung Ihres Entwicklungsprozesses zu beschleunigen, sollten Sie Java wählen, versuchen Sie niemals Müll wie Python ... der behauptet, Sie könnten die DEV-Zeit verkürzen.


Diese Lektüre könnte Sie interessieren: paulgraham.com/avg.html - es geht um die Stärke von Programmiersprachen.

3
Mit begrenzter Zeit und begrenztem Budget kann man nicht für alle Zeit aufwenden - es muss eine Priorität geben.
JBRWilkinson

@JRBWilkinson Nun, sollte von Fall zu Fall sein
Takt
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.