Assembler

Wissbegierde ist immer gut. Geschwindigkeitsoptimierung solltest du sofort wieder abhaken.

C++-Code wird Compiler eh in Assembler umgesetzt. Bis du aber jemals ansatzweise die Geschwindigkeit eines Compilers erreichst, werden Monate ins Land gehen. Vergiss Taktzyklen, die sind seit mind. 15 Jahren irrelevant. Alles worauf es ankommt ist auf prozessorspezifische Pipelinegrößen, Caches, Prefetching und Optimierungsstrategien hin zu programmieren. Das ist beliebig kompliziert und das Wissen was Compilerbauer hier bereits reingesteckt haben ist gewaltig.

In der Regel liegt das Problem in den Algorithmen. Ein ineffektiver Algorithmus ist in C++ wie auch in Assembler langsam (Komplexität). Ein Algorithmus mit logarithmischer Laufzeit wird amortisiert einen Algorithmus mit linearer Laufzeit ausschießen. Zumal - wenn man nicht weiß, wo die langsamen Stellen sind, kann man das Optimieren gleich ganz sein lassen. Diese Frage beantwortet detailliertes Code-Profiling. Optimierung an Code, der garnicht ins Gewicht fällt, ist vertane Zeit und damit auch vertanes Geld.

Außerdem muss man sich schon entscheiden - hardware unabhängig oder nicht? Mit einer Mischung aus beidem gibst du die Hardware-Unabhängigen Vorteile von C++ komplett auf. Die Wartbarkeit leidet davon abgesehen auch noch dramatisch.
 
Also ein paar Tipps von mir:

1. Wie bereits erwähnt vergiss es!
2. Wenn du C++ programmierst (so wie du schreibst) und nicht weißt ob dein Code effizient ist, dann leih oder kauf dir ein Buch (z.B. "Effektiv C++ programmieren" von Scott Meyers) Wenn du Regeln beachtest kannst du fast keinen ineffizienten Code generieren.
3. Wenn du wirklich ein bisschen Eindrücke über Assembler haben willst, dann benutze dein Visual Studio! Setz einfach einen Breakpoint auf irgendeine Zeile (z.B. int b = 3;) und dann mach das Disassembly auf, dort siehst du dann die Assemblerbefehle.Ohne Optimierung generiert der Kompiler auch noch schön linear das was du hinschreibst. Wenn du den Kompiler dann aber optimieren lässt, macht er zwar auch das, was du im vorgibst, aber kann die Instruktionen vertauschen usw. usf. Ist alles ziemlich wild dann :)
 
sse wird auch von Compilern unterstützt. Der VC++ Compiler unterstützt z.B. SSE/SSE2, der Intel mit Sicherheit alles was geht.
 
Also gut, dann formuliere ich es so:

Es ist billiger für 1000$ den Intel Compiler zu kaufen als sich mühsam und langwierig durch Assembler durchzuquälen. :-)
 
Nun, alles Wichtige wurde ja schon genannt: Taktzyklen spielen keine Rolle, Compiler erzeugen immer den Besseren Code (Firmenpolitik spiel hierbei natürlich keine Rolle) und SIMD beherrschen sie so wie so aus dem ff. Wie gut das wir hier Leute haben die dich von einem finanziellen Desaster abhalten, ansonsten müsste dein Familie, die ja von deinen Programmierfähigkeiten leben soll, später unter der Brücke hausen. Und nur der Trivialität wegen: Du bist ja so wies so nur am cracken oder erstellen von Shell-Code interessiert, von daher sollte man dir auch nicht weiter Hefen…

:evillol:
 
Bei normalen x86 Code ist es schwer besseren Code zu produzieren als die Compiler. Aber vor allem im Video-/Audiobereich wird sehr häufig noch asm eingesetzt, so sind z.B. bei x264 alle Performance-kritischen Teile (meist SSE-Code) mit Assembler handoptimiert. Da alle Assembler-Funktionen auch in C-Code vorhanden sind und man mittels --no-asm Parameter die Assembler-Funktionen abschalten kann, hat man da eine sehr schöne Vergleichsmöglichkeit. Die optimierte Version distanziert den reinen C-Code da um mehr als 100%.
 
Woey schrieb:
Nun, alles Wichtige wurde ja schon genannt: Taktzyklen spielen keine Rolle, Compiler erzeugen immer den Besseren Code (Firmenpolitik spiel hierbei natürlich keine Rolle) und SIMD beherrschen sie so wie so aus dem ff. ...
:evillol:

Zeig mir mal ein Code mit den der VC++ Compiler SIMD verwendet und damit wirklich signifikant schneller ist als ohne (also min 100%).
 
Zurück
Oben