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.

7voto

Larry Osterman Punkte 15976

Das hängt ganz von Ihrer Arbeitsbelastung ab.

Für alltägliche Operationen sind C und C++ völlig ausreichend, aber es gibt bestimmte Arbeitslasten (alle Transformationen, die mit Video zu tun haben (Komprimierung, Dekomprimierung, Bildeffekte usw.)), für die Assembler unbedingt erforderlich ist, um leistungsfähig zu sein.

Außerdem werden in der Regel CPU-spezifische Chipsatzerweiterungen (MME/MMX/SSE/was auch immer) verwendet, die auf diese Art von Betrieb abgestimmt sind.

6voto

Die einfache Antwort... Einer, der kennt Montage gut (auch bekannt als derjenige, der die Referenz neben sich hat und jede noch so kleine Cache- und Pipeline-Funktion des Prozessors ausnutzt) ist garantiert in der Lage, viel schnelleren Code zu produzieren als jede Kompilator.

Allerdings spielt der Unterschied bei der typischen Anwendung heutzutage keine Rolle mehr.

1 Stimmen

Sie haben vergessen zu sagen, dass es "viel Zeit und Mühe kostet" und "ein Alptraum für die Wartung ist". Ein Kollege von mir arbeitete an der Optimierung eines leistungskritischen Abschnitts des Betriebssystemcodes, und er arbeitete viel mehr in C als in Assembler, da er so die Leistungsauswirkungen von Änderungen auf hoher Ebene innerhalb eines angemessenen Zeitrahmens untersuchen konnte.

0 Stimmen

Ich bin einverstanden. Manchmal verwendet man Makros und Skripte zur Erzeugung von Assemblercode, um Zeit zu sparen und schnell zu entwickeln. Die meisten Assembler haben heutzutage Makros; wenn nicht, können Sie einen (einfachen) Makro-Präprozessor mit einem (recht einfachen RegEx) Perl-Skript erstellen.

0 Stimmen

Dies. Ganz genau. Der Compiler, der die Fachexperten schlägt, ist noch nicht erfunden worden.

6voto

pseudosaint Punkte 41

LInux Montageanleitung stellt diese Frage und nennt die Vor- und Nachteile der Montage.

6voto

SurDin Punkte 3161

Ich habe eine Operation der Transposition von Bits, die auf 192 oder 256 Bits jede Unterbrechung, die alle 50 Mikrosekunden geschieht, durchgeführt werden muss.

Dies geschieht durch eine feste Zuordnung (Hardware-Zwänge). Mit C dauerte es etwa 10 Mikrosekunden, um es zu machen. Als ich dies in Assembler übersetzte, benötigte ich unter Berücksichtigung der besonderen Merkmale dieser Karte, der spezifischen Register-Cache-Funktion und der Verwendung bitorientierter Operationen weniger als 3,5 Mikrosekunden für die Ausführung.

5voto

http://cr.yp.to/qhasm.html hat viele Beispiele.

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