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)?
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.
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.
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 ;-).
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! :)
Rechenaufgaben scheinen in etwa zwei große Gruppen unterteilt zu sein.
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.
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.
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.
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
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.
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.
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
Ein Computer ist wie ein Jugendzimmer.
Es wird nie groß genug sein, um all den Müll zu halten.
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)
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:)
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.
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 .
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!
Ja, wir sind an dem Punkt, an dem Optimierung eine Rolle spielt und in absehbarer Zukunft da sein wird. Weil:
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: -)
Obwohl CPUs immer schneller werden, können Sie immer optimieren
(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.
Tags und Links optimization performance gpu cpu-speed moores-law