Wird die Optimierung von Code unnötig?

7

Wenn Moores Gesetz wahr ist und CPUs / GPUs immer schneller werden, werden Software (und damit auch Ihre Softwareentwickler) verschieben die Grenzen immer noch so weit, dass Sie Ihren Code noch optimieren müssen? Oder ist eine naive faktorielle Lösung gut genug für Ihren Code (etc)?

    
jkeys 12.06.2009, 23:59
quelle

26 Antworten

18

Schlechter Code kann CPU-Geschwindigkeit immer überwinden.

Ein hervorragendes Beispiel finden Sie in dieser Coding Horror -Spalte und blättern Sie nach unten zum Abschnitt, der das Thema beschreibt Buch Programmierung Perlen . Hier ist eine Grafik wiedergegeben, die zeigt, wie ein TRS-80 mit einem 4,77 MHz 8-Bit-Prozessor für einen bestimmten Algorithmus einen 32-Bit-Alpha-Chip schlagen kann.

Der aktuelle Trend bei den Beschleunigungen besteht darin, mehr Kerne hinzuzufügen, da schwer die einzelnen Kerne schneller werden lassen. Die Gesamtgeschwindigkeit steigt also, aber lineare Aufgaben profitieren nicht immer.

Das Sprichwort "Es gibt kein Problem, das rohe Gewalt und Ignoranz nicht überwinden können" ist nicht immer wahr.

    
lavinio 13.06.2009, 00:11
quelle
31

2x die Verarbeitungsleistung tut nicht viel, um die Scheußlichkeit Ihrer lausigen n ^ 2 Suche zu verbessern.

    
mquander 13.06.2009 00:04
quelle
13

Je schneller Computer werden, desto mehr erwarten wir von ihnen.

    
Crashworks 13.06.2009 00:00
quelle
12

Ob es schneller Code für mehr Polygone in einem Videospiel ist oder schnellere Algorithmen für den Handel auf den Finanzmärkten. Wenn es einen Wettbewerbsvorteil gibt, schneller zu sein, wird Optimierung immer noch wichtig sein. Du musst nicht den Löwen hinter dir lassen, der dich und deinen Freund verfolgt - du musst nur deinen Kumpel überholen.

    
Nosredna 13.06.2009 00:06
quelle
11

Bis alle Programmierer beim ersten Mal optimalen Code schreiben, wird es immer einen Platz für die Optimierung geben. In der Zwischenzeit ist die eigentliche Frage: Wofür sollten wir zuerst optimieren?

    
Shog9 13.06.2009 00:02
quelle
10

Moores Gesetz spricht darüber, wie viele Transistoren wir auf einen Chip packen können - es hat nichts zu sagen, dass diese Transistoren in der Lage sind, mit steigender Geschwindigkeit zu schalten. Tatsächlich haben die Taktraten in den letzten Jahren mehr oder weniger stagniert - wir bekommen immer mehr "Kerne" (im Prinzip komplette CPUs) pro Chip. Um dies zu nutzen, ist eine Parallelisierung des Codes erforderlich. Wenn Sie also "naiv" schreiben, wird der magische Optimierer der Zukunft damit beschäftigt sein, verborgene Parallelität in Ihrem Code zu finden, damit er mehrere Kerne verarbeiten kann (realistischer, z In der vorhersehbaren Zukunft müssen Sie Ihrem Compiler viel helfen ;-).

    
Alex Martelli 13.06.2009 00:06
quelle
10

Wirths Gesetz :

  

Die Software wird langsamer langsamer, als die Hardware schneller wird.

P.S. Auf eine ernstere Anmerkung: Wenn das Rechenmodell zur Parallelverarbeitung übergeht, wird die Codeoptimierung wichtiger. Wenn Sie Ihren Code 2x optimieren und er läuft 5 Minuten statt 10 Minuten auf 1 Box, kann es nicht so beeindruckend sein. Der nächste Computer mit 2x Geschwindigkeit wird dies kompensieren. Aber stellen Sie sich vor, dass Sie Ihr Programm auf 1000 CPUs ausführen. Dann spart jede Optimierung viel Maschinenzeit. Und Elektrizität. Optimiere und rette die Erde! :)

    
Igor Krivokon 13.06.2009 00:12
quelle
5

Rechenaufgaben scheinen in etwa zwei große Gruppen unterteilt zu sein.

  1. Probleme mit eingeschränkten Rechenanforderungen.
  2. Probleme mit unbegrenzten Rechenanforderungen.

Die meisten Probleme passen in diese erste Kategorie. Zum Beispiel Echtzeit-3D-Rasterung. Für lange Zeit war dieses Problem für typische Verbraucherelektronik unerreichbar. Es gab keine überzeugenden 3D-Spiele oder andere Programme, die Echtzeit-Welten auf einem Apple produzieren könnten. Irgendwann jedoch hat die Technik aufgeholt, und jetzt ist dieses Problem erreichbar. Ein ähnliches Problem ist die Simulation der Proteinfaltung. Bis vor kurzem war es nicht möglich, eine bekannte Peptidsequenz in das resultierende Proteinmolekül umzuwandeln, aber moderne Hardware macht dies in wenigen Stunden oder Minuten der Verarbeitung möglich.

Es gibt jedoch ein paar Probleme, die von Natur aus alle verfügbaren Rechenressourcen absorbieren können. Die meisten davon sind dynamische physikalische Simulationen. Offensichtlich ist es möglich, ein Rechenmodell von beispielsweise dem Wetter zu erstellen. Wir machen das fast so lange wie wir Computer hatten. Ein solch komplexes System profitiert jedoch von erhöhter Genauigkeit. Simulation mit immer feinerer räumlicher und zeitlicher Auflösung verbessert die Vorhersagen Stück für Stück. Aber egal, wie viel Genauigkeit eine gegebene Simulation hat, es gibt Raum für mehr Genauigkeit mit dem folgenden Nutzen.

Beide Arten von Problemen haben einen sehr großen Nutzen für die Optimierung aller Arten. Der zweite Typ ist ziemlich offensichtlich. Wenn das Programm, das die Simulation durchführt, ein wenig verbessert wird, dann läuft es ein bisschen schneller und gibt Ergebnisse etwas früher oder mit etwas mehr Genauigkeit.

Der erste ist jedoch etwas subtiler. Für einen gewissen Zeitraum lohnt sich kein Optimierungsaufwand, da kein Computer vorhanden ist, der dafür schnell genug ist. Nach einer Weile ist die Optimierung etwas sinnlos, da die Hardware, die sie ausführt, um ein Vielfaches schneller ist als nötig. Aber es gibt ein schmales Fenster, in dem eine optimale Lösung akzeptabel auf der aktuellen Hardware läuft, aber eine suboptimale Lösung wird nicht funktionieren. Während dieser Zeit kann eine sorgfältig bedachte Optimierung der Unterschied zwischen einem Produkt sein, das auf den ersten Markt kommt, und einem Produkt, das auch ran.

    
quelle
3

Es gibt mehr zu optimieren als Geschwindigkeit. Moores Gesetz gilt nicht für Computerspeicher. Bei der Optimierung wird häufig auch der Code kompiliert, um CPU-spezifische Anweisungen zu nutzen. Dies sind nur einige der Optimierungen, die ich mir vorstellen kann und die nicht von schnelleren CPUs gelöst werden.

    
Andrew Hare 13.06.2009 00:00
quelle
3

Eine Optimierung wird immer notwendig sein, denn der mildernde Faktor für Moores Gesetz ist bloatware .

    
Not Sure 13.06.2009 00:06
quelle
2

Andere Antworten scheinen sich auf die Geschwindigkeitsseite des Problems zu konzentrieren. Das ist gut. Das wirkliche Problem, das ich sehen kann, ist, dass wenn Sie Ihren Code optimieren, es weniger Energie benötigt, um es auszuführen. Ihr Rechenzentrum läuft kühler, Ihr Laptop hält länger, Ihr Telefon kostet mehr als einen Tag. Es gibt einen echten Selektionsdruck an diesem Marktende.

    
user60401 13.06.2009 00:13
quelle
1

Die Optimierung wird in vielen Situationen weiterhin benötigt, insbesondere:

  • Echtzeit-Systeme, bei denen die CPU-Zeit knapp ist

  • Eingebettete Systeme, bei denen der Speicher ein Speicher ist, stehen im Vordergrund

  • Server, bei denen viele Prozesse gleichzeitig Aufmerksamkeit erfordern

  • Spiele, bei denen 3-D-Ray-Tracing, Audio, KI und Networking für ein sehr anspruchsvolles Programm sorgen können

Colin 13.06.2009 00:10
quelle
1

Die Welt verändert sich, und wir müssen uns damit verändern. Als ich anfing, ging es bei einem guten Programmierer darum, all die kleinen Mikrooptimierungen zu kennen, die man tun konnte, um weitere 0,2% aus einer Routine herauszuquetschen, indem man Zeiger in C manipulierte, und andere Dinge wie diese. Jetzt verbringe ich viel mehr Zeit damit, Algorithmen verständlicher zu machen, weil das auf die Dauer wertvoller ist. Aber - es gibt immer Dinge zu optimieren und immer Engpässe. Mehr Ressourcen bedeutet, dass die Menschen mehr von ihren Systemen erwarten, also ist es für einen Profi keine sinnvolle Option, schlampig zu sein.

Optimierungsstrategien ändern sich jedoch, wenn Sie mehr Geschwindigkeit / Arbeitsspeicher / Ressourcen hinzufügen, um damit zu arbeiten.

Einige Optimierungen haben nichts mit Geschwindigkeit zu tun. Wenn Sie beispielsweise Multithread-Algorithmen optimieren, optimieren Sie möglicherweise die Gesamtanzahl der gemeinsamen Sperren. Das Hinzufügen von mehr Verarbeitungsleistung in Form von Geschwindigkeit (oder schlimmer, Prozessoren) hat möglicherweise keine Auswirkungen, wenn Ihre aktuelle Verarbeitungsleistung darauf verwendet wird, auf Sperren zu warten ... Das Hinzufügen von Prozessoren kann sogar Ihre Gesamtleistung verringern, wenn Sie Dinge falsch machen . Optimierung bedeutet in diesem Fall, dass Sie versuchen, die Anzahl der Sperren zu reduzieren und sie so feinkörnig wie möglich zu halten, anstatt zu versuchen, die Anzahl der Anweisungen zu reduzieren.

    
Reed Copsey 13.06.2009 00:31
quelle
1

Solange einige Leute langsamen Code schreiben, der übermäßige Ressourcen verwendet, müssen andere ihren Code optimieren, um diese Ressourcen schneller bereitzustellen und die Geschwindigkeit zurückzubekommen.

Ich finde es erstaunlich, wie kreativ manche Entwickler suboptimalen Code schreiben können. Bei meinem vorherigen Job hat ein Typ eine Funktion geschrieben, um die Zeit zwischen zwei Daten zu berechnen, indem man beispielsweise ein Datum erhöht und vergleicht.

    
Matthias Wandel 13.06.2009 00:33
quelle
1

Computergeschwindigkeit kann menschlichen Fehler nicht immer überwinden. Die Fragen könnten formuliert werden: " Werden CPUs so schnell, dass Compiler sich die Zeit nehmen können um Implementierungsprobleme zu fangen (und zu beheben) ." Offensichtlich wird Code-Optimierung (in absehbarer Zukunft) nötig sein, um die Probleme des Malers Shlemiel zu lösen. - - - p>

Bei der Softwareentwicklung geht es immer noch darum, dem Computer genau zu sagen, was er tun soll. Was "zunehmend schnelle" CPUs uns geben werden, ist die Fähigkeit, zunehmend abstrakte und natürliche Programmiersprachen zu entwerfen, bis hin zu dem Punkt, an dem Computer unsere Absichten annehmen und all die Low-Level-Details umsetzen ... eines Tages .

Viel Spaß,

Robert C. Cartaino

    
Robert Cartaino 13.06.2009 00:54
quelle
1

Ein Computer ist wie ein Jugendzimmer.

Es wird nie groß genug sein, um all den Müll zu halten.

    
Mike Dunlavey 19.06.2009 18:07
quelle
1

Ich denke, dass das Ergebnis davon ist, dass die Rechenleistung billiger wird, so dass der Programmierer weniger Zeit für die Ausführung einer bestimmten Aufgabe aufwenden kann. Zum Beispiel sind Sprachen höherer Ebenen, wie Java oder Python, fast immer langsamer als untergeordnete Sprachen wie Assembly. Aber es ist so viel einfacher für den Programmierer, dass neue Dinge möglich sind. Ich denke, das Endziel wird sein, dass Computer in der Lage sein werden, direkt mit Menschen zu kommunizieren und menschliche Sprache in Byte-Code zu kompilieren. Dann werden Programmierer aufhören zu existieren. (Und Computer könnten die Welt übernehmen)

    
Fractaly 13.12.2011 02:29
quelle
0

Richtig oder falsch, es passiert schon meiner Meinung nach, und es ist nicht immer unbedingt eine schlechte Sache. Bessere Hardware bietet dem Entwickler die Möglichkeit, sich mehr auf die Lösung des Problems zu konzentrieren, als sich um die zusätzlichen 10% der Speicherauslastung Sorgen zu machen.

Die Optimierung ist nicht zu beanstanden, aber nur wenn sie benötigt wird. Ich denke, die zusätzliche Hardwarekraft reduziert einfach die Fälle, in denen sie wirklich benötigt wird. Wer jedoch die Software schreibt, um das Space Shuttle zum Mond zu starten, hat seinen Code optimiert:)

    
Cody C 13.06.2009 00:06
quelle
0

Wenn man bedenkt, dass Computer tausendmal schneller sind als vor ein paar Jahrzehnten, aber im Allgemeinen nicht viel schneller erscheinen, würde ich sagen, dass wir noch einen langen Weg vor uns haben, bevor wir aufhören, uns Gedanken über Optimierung zu machen. Das Problem ist, dass Computer immer leistungsfähiger werden, wenn Computer leistungsfähiger werden, so dass wir auf höheren Abstraktionsebenen arbeiten können. Die Optimierung auf jeder Abstraktionsebene bleibt wichtig.

Ja, Computer machen viele Dinge viel schneller: Sie können ein Mandelbrot in Minuten zeichnen, die früher Tage der Computerzeit benötigten. Ein GIF wird fast augenblicklich geladen, anstatt dass sichtbare Sekunden auf dem Bildschirm gezeichnet werden. Viele Dinge sind schneller. Aber Surfen ist zum Beispiel nicht viel schneller. Die Textverarbeitung ist nicht viel schneller. Wenn Computer leistungsfähiger werden, erwarten wir mehr und wir machen Computer mehr

.

Die Optimierung wird für die absehbare Zukunft wichtig sein. Mikrooptimierungen sind jedoch weit weniger wichtig als früher. Die wichtigste Optimierung in diesen Tagen kann die Wahl des Algorithmus sein. Wählen Sie O (n log n) oder O (n ^ 2) .... etc.

    
Eddie 13.06.2009 00:06
quelle
0

Die Kosten für die Optimierung sind sehr niedrig, daher bezweifle ich, dass es nötig sein wird, sie fallen zu lassen. Das eigentliche Problem besteht darin, Aufgaben zu finden, um die gesamte Rechenleistung zu nutzen - also anstatt die Optimierung zu optimieren, optimieren wir unsere Fähigkeit, Dinge in parallel .

    
JP Alioto 13.06.2009 00:06
quelle
0

Irgendwann werden wir nicht in der Lage sein, schneller zu werden, schließlich werden wir durch den Platz begrenzt sein, weshalb Sie neuere Prozessoren unter 3GHZ und Multi-Core sehen. Also ist ja noch Optimierung notwendig.

    
jr3 13.06.2009 00:07
quelle
0

Die Optimierung von Code wird immer in gewissem Umfang erforderlich sein und nicht nur die Ausführungsgeschwindigkeit und die Speicherauslastung verringern. Die Suche nach der optimalen energieeffizienten Methode zur Verarbeitung von Informationen wird beispielsweise in Rechenzentren eine wichtige Anforderung sein. Profiling-Fähigkeiten werden viel wichtiger werden!

    
Jonathan Webb 13.06.2009 00:31
quelle
0

Ja, wir sind an dem Punkt, an dem Optimierung eine Rolle spielt und in absehbarer Zukunft da sein wird. Weil:

  • Die RAM-Geschwindigkeit steigt mit geringerer Geschwindigkeit als die CPU-Geschwindigkeit. Daher gibt es eine noch weiter zunehmende Leistungslücke zwischen CPU und RAM. Wenn Ihr Programm viel auf RAM zugreift, müssen Sie die Zugriffsmuster optimieren, um den Cache effizient auszunutzen. Ansonsten ist die superschnelle CPU 90% der Zeit im Leerlauf und wartet nur darauf, dass die Daten ankommen.
  • Anzahl der Kerne erhöht und steigt. Profitiert Ihr Code von jedem hinzugefügten Kern oder läuft er auf einem einzelnen Kern? Hier bedeutet Optimierung Parallelisierung, und je nach Aufgabenstellung kann es schwierig sein.
  • CPU-Geschwindigkeiten werden nie mit exponentiellen Algorithmen und anderen Brute-Force-Arten von Dingen Schritt halten. Wie schön illustriert durch diese Antwort .
Laurynas Biveinis 13.06.2009 07:06
quelle
0

Hoffen wir, dass die Netzwerkgeschwindigkeiten so hoch bleiben, dass wir genug Daten über die Leitung schaufeln können, um mit den CPUs mitzuhalten ...

Wie bereits erwähnt, gibt es immer Engpässe

    
gbn 13.06.2009 07:49
quelle
0

Angenommen, Ihre CPU hat so viele Transistoren wie die Anzahl der subatomaren Teilchen im Universum und ihre Uhr läuft mit der Frequenz der harten kosmischen Strahlung, Sie können sie trotzdem schlagen.

Wenn Sie der neuesten CPU-Uhr voraus sein wollen, fügen Sie einfach eine weitere Verschachtelungsebene in Ihren Schleifen hinzu oder fügen Sie eine weitere Verschachtelungsebene in Ihren Unterprogrammaufrufen hinzu.

Oder wenn Sie wirklich professionell sein möchten, fügen Sie eine weitere Abstraktionsebene hinzu.

Es ist nicht schwer: -)

    
Mike Dunlavey 13.06.2009 13:51
quelle
0

Obwohl CPUs immer schneller werden, können Sie immer optimieren

  • Netzwerkdurchsatz,
  • Festplatte sucht,
  • Festplattennutzung,
  • Speichernutzung,
  • Datenbanktransaktionen,
  • Anzahl der Systemaufrufe,
  • Planung und Sperren der Granularität,
  • Garbage Collection.

(das sind reale Beispiele, die ich im letzten halben Jahr gesehen habe).

Verschiedene Teile komplexer Computersysteme werden an verschiedenen Stellen der Computergeschichte als teuer angesehen. Sie müssen die Engpässe messen und beurteilen, wo Sie die Mühe machen.

    
Tadeusz A. Kadłubowski 13.06.2009 14:06
quelle