502 Stimmen

Wann ist Assembler schneller als C?

Einer der angegebenen Gründe für Assembler-Kenntnisse ist, dass man damit gelegentlich Code schreiben kann, der leistungsfähiger ist als der Code in einer höheren Sprache, insbesondere C. Ich habe aber auch schon oft gehört, dass, obwohl das nicht ganz falsch ist, die Fälle, in denen Assembler helfen kann eigentlich zur Generierung von leistungsfähigerem Code verwendet werden können, sind extrem selten und erfordern Expertenwissen und Erfahrung mit Assembler.

Diese Frage geht noch nicht einmal auf die Tatsache ein, dass Assembler-Anweisungen maschinenspezifisch und nicht portierbar sind, oder auf andere Aspekte von Assembler. Es gibt viele gute Gründe, Assembler zu kennen, abgesehen von diesem, natürlich, aber dies soll eine spezifische Frage sein, die nach Beispielen und Daten fragt, nicht ein ausgedehnter Diskurs über Assembler gegenüber höheren Sprachen.

Kann jemand etwas über spezifische Beispiele in welchen Fällen Assembler schneller ist als gut geschriebener C-Code mit einem modernen Compiler, und können Sie diese Behauptung mit Profilergebnissen belegen? Ich bin mir ziemlich sicher, dass es diese Fälle gibt, aber ich möchte wirklich genau wissen, wie esoterisch diese Fälle sind, da dies ein Punkt zu sein scheint, über den man streiten kann.

0 Stimmen

Und nun wäre eine weitere Frage angebracht: Wann ist die Tatsache, dass Assembler schneller ist als C, tatsächlich von Bedeutung?

20 Stimmen

Eigentlich ist es recht trivial, kompilierten Code zu verbessern. Jeder, der über solide Kenntnisse in Assembler und C verfügt, kann dies erkennen, indem er den erzeugten Code untersucht. Eine einfache Möglichkeit ist die erste Leistungsklippe, von der man herunterfällt, wenn man in der kompilierten Version keine freien Register mehr hat. Im Durchschnitt wird der Compiler bei einem großen Projekt weitaus besser abschneiden als ein Mensch, aber es ist nicht schwer, bei einem Projekt von angemessener Größe Leistungsprobleme im kompilierten Code zu finden.

19 Stimmen

Die kurze Antwort lautet eigentlich: Assembler ist siempre Der Grund dafür ist, dass man Assembler ohne C haben kann, aber man kann C nicht ohne Assembler haben (in der binären Form, die wir früher "Maschinencode" nannten). Das heißt, die lange Antwort ist: C-Compiler sind ziemlich gut darin, zu optimieren und über Dinge "nachzudenken", an die man normalerweise nicht denkt, also hängt es wirklich von Ihren Fähigkeiten ab, aber normalerweise können Sie den C-Compiler immer schlagen; es ist immer noch nur eine Software, die nicht denken und Ideen bekommen kann. Sie können auch portablen Assembler schreiben, wenn Sie Makros verwenden und geduldig sind.

0voto

Heutzutage ist es in Anbetracht von Compilern wie Intel C++, die den C-Code extrem optimieren, sehr schwer, mit der Leistung von Compilern zu konkurrieren.

9 Stimmen

Das ist nicht wirklich wahr. Wenn Sie als Assembler-Programmierer angefangen haben und Assembler so schnell wie C lesen können, werden Sie über die Ausgabe von GCC und anderen Compilern entsetzt sein. Auf dem PC (da sie heutzutage so schnell sind), spielt das normalerweise keine Rolle. Aber wenn man mit Videobildern hantiert, macht es einen gewaltigen Unterschied.

2 Stimmen

Wenn der C-Compiler Ihren Code optimieren kann, dann kann ein erfahrener Assembler-Programmierer seine Arbeit besser machen. Liegt das nicht auf der Hand?

0voto

webclimber Punkte 2600

Ich würde sagen, wenn Sie besser sind als der Compiler für einen bestimmten Satz von Anweisungen. Also keine generische Antwort, denke ich

1 Stimmen

Nein, das ist keine ausreichende Rechtfertigung. Man muss auch bereit sein, auf die Fähigkeit des Compilers zu verzichten, große Mengen an Code zu optimieren. Die Änderung einer Konstante an einer Stelle könnte verschiedene coole asm-Tricks an vielen Stellen ermöglichen, an denen eine Funktion inlined ist, und wenn Sie das nicht bei jeder Quelltextänderung von Hand machen wollen, lohnt sich das nicht. (Es sei denn, Ihr Compiler ist wirklich schlecht und Sie können ihn um einiges schlagen.)

1 Stimmen

Sie müssen auch auf die Zukunftssicherheit verzichten, in 10 oder 20 Jahren mit einem besseren Compiler neu kompilieren zu können, damit Ihr Code für die dann aktuellen Mikroarchitekturen optimiert ist. (Selbst wenn es immer noch x86 ist, kann eine andere Befehlsauswahl besser sein.) Ihr handgeschriebener Code wird für Haswell oder Skylake und vielleicht Ryzen optimiert sein, wenn Sie das im Sinn hatten, als Sie ihn geschrieben haben, aber Sie können nicht wissen, welche Befehle in 20 Jahren langsamer oder schneller sein werden. TL:DR: C zu schreiben, das nach Möglichkeit besser optimiert ist, anstatt asm zu schreiben

0voto

Dewayne Gunter Punkte 1

Eigentlich können Sie große Programme in einem großen Modell-Modus segaments kann auf 64kb Code beschränkt werden, aber Sie können viele segaments schreiben, Leute geben das Argument gegen ASM, wie es eine alte Sprache ist und wir brauchen nicht, um Speicher mehr zu bewahren, wenn das der Fall wäre, warum würden wir packen unsere PC's mit Speicher, der einzige Fehler, den ich mit ASM finden kann, ist, dass es mehr oder weniger Prozessor basiert, so dass die meisten Programme für die Intel-Architektur geschrieben Höchstwahrscheinlich würde nicht auf eine AMD-Architektur laufen. Was die Tatsache angeht, dass C schneller ist als ASM, so gibt es keine Sprache, die schneller ist als ASM, und ASM kann viele Dinge tun, die C und andere HLLs auf Prozessorebene nicht tun können. ASM ist eine schwer zu erlernende Sprache, aber wenn man sie einmal gelernt hat, kann keine HLL sie besser übersetzen als man selbst. Wenn Sie nur einige der Dinge sehen könnten, die HLLs mit Ihrem Code machen, und verstehen würden, was sie tun, würden Sie sich fragen, warum nicht mehr Leute ASM benutzen und warum Assembler nicht mehr aktualisiert werden (für den allgemeinen Gebrauch sowieso). Also nein, C ist nicht schneller als ASM. Sogar erfahrene C++ Programmierer benutzen und schreiben immer noch Code Chunks in ASM, die sie aus Geschwindigkeitsgründen ihrem C++ Code hinzufügen. Auch andere Sprachen, von denen manche Leute denken, sie seien veraltet oder möglicherweise nicht gut, sind manchmal ein Mythos, z.B. ist Photoshop in Pascal/ASM geschrieben. Die erste Version von Souce wurde dem Museum für technische Geschichte übergeben, und Paintshop Pro ist immer noch in Python, TCL und ASM geschrieben. ... ein gemeinsamer Nenner dieser "schnellen und großartigen Bildbearbeitungsprogramme ist ASM, auch wenn Photoshop jetzt auf Delphi aufgerüstet hat, ist es immer noch Pascal. und alle Geschwindigkeitsprobleme kommen von Pascal, aber das ist, weil wir die Art und Weise mögen, wie Programme aussehen und nicht, was sie heutzutage tun. Ich würde gerne einen Photoshop-Klon in reinem ASM machen, an dem ich arbeite und der ziemlich gut vorankommt. nicht codieren, interpretieren, anordnen, umschreiben, etc.... Nur Code und gehen Prozess abgeschlossen.

-3voto

Cory R. King Punkte 2706

Ich habe früher mit jemandem zusammengearbeitet, der sagte: "Wenn der Compiler zu dumm ist, um herauszufinden, was Sie zu tun versuchen, und es nicht optimieren kann, ist Ihr Compiler kaputt und es ist Zeit, einen neuen zu kaufen". Ich bin sicher, dass es Grenzfälle gibt, in denen Assembler Ihren C-Code schlägt, aber wenn Sie häufig Assembler verwenden, um Ihren Compiler zu "besiegen", ist Ihr Compiler kaputt.

Das Gleiche gilt für das Schreiben von "optimiertem" SQL, das versucht, den Abfrageplaner zu zwingen, etwas zu tun. Wenn Sie sich dabei ertappen, dass Sie Abfragen neu arrangieren, um den Planer dazu zu bringen, das zu tun, was Sie wollen, ist Ihr Abfrageplaner kaputt - kaufen Sie einen neuen.

6 Stimmen

Die Behauptung, dass es "Randfälle" gibt, sagt mir, dass Sie nicht viel Assembler schreiben. Ich kann einem C-Compiler mit Assembler immer die Hosen ausziehen. Das einzige Problem ist zu entscheiden, wann es sich lohnt oder wann es wichtig ist.

-3voto

neo5003 Punkte 131

Diese Frage ist ein wenig sinnlos, da c ohnehin in Assembler kompiliert wird. Aber der Assembler, der von optimierenden Compilern erzeugt wird, ist fast vollständig optimiert, so dass man den Compiler nicht schlagen kann, es sei denn, man hat zwanzig Doktortitel über die Optimierung spezifischer Assemblierung gemacht.

2 Stimmen

Sie trauen den Compilern zu viel zu. Für eine einzelne Schleife braucht man nur 1 oder 2 Doktortitel an Fähigkeiten und Erfahrung, um den Compiler zu schlagen, z.B. beim Tuning für moderne x86. Sicherlich sind Compiler im Großen und Ganzen gut, aber sie haben oft zumindest kleinere Optimierungsfehler bei engen Schleifen. z.B. C++-Code zum Testen der Collatz-Vermutung schneller als handgeschriebener Assembler - warum? zeigt ein Beispiel für eine sehr kleine Schleife, bei der es nicht allzu schwer war, den Compiler zu überlisten. Ich will damit nicht sagen, dass Sie tatsächlich sollte in asm schreiben, nur dass Ihr Argument nicht stichhaltig ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X