Kann man den kompilierten C++-Code mit Assembler sinnvoll nachbearbeiten?

Hallo,

ich arbeite seit einer Weile mit meinem C64 und daher auch mit Assembler. Das war auch der Auslöser dafür, dass ich nachgedacht habe, wieviel eigentlich an Leistung verloren geht, wenn man in C++ und nicht direkt in Assembler programmiert. Zum Beispiel schreibe ich gerade in C++:

unsigned ... abc, xyz;
abc += xyz;
if(abc < xyz){
 ...
}

Dieses Programm wartet im Grunde auf einen Überlauf der Variable abc, denn wenn man etwas hinzufügt und kein Überlauf stattfindet, dann muss die Variable mindestens so groß wie der Summand sein. Die Assembler-Entsprechung wäre zumindest bei 6502-Assembler

ABC = ...
XYZ = ...

lda ABC
adc XYZ
sta ABC
cmp ABC
bpl endif
 ...
endif

, wenn man alles direkt übersetzt. Das kostet 14-15 Zyklen.

ABC = ...
XYZ = ...

lda ABC
adc XYZ
sta ABC
bcc endif
 ...
endif

macht nichts anderes, aber es braucht nur 11-12 Zyklen und auch weniger Speicher.
Daher meine Frage: Wäre es möglich, dass man C++-Programme ernsthaft optimieren kann, wenn man sie noch mit Assembler nachbearbeitet? Machen die Kompiler das überhaupt so, wie ich es gemacht habe, oder können die das so sehr optimieren, dass letzteres dabei rumkommt? Gibt es irgendwelche Tools, mit denen man sich die Assembler-Entsprechung von C++-Zeilen ansehen kann und dann dem Kompiler mitteilen kann, dass er in gewissen Zeilen das Assembler-Ergebnis anpassen soll?

Gruß
HTML-Fan

Die Compiler optimieren schon extrem. Der Code der dabei herauskommt hat zum Teil wenig direkt mit dem eigentlichen C++ Code gemein.

Hand-Optimierung braucht man nur wenn Performance wirklich extrem wichtig ist. Das ist nicht so oft der Fall wie man leicht denkt. FastLED z.B. hat viele handgeschriebene Teile. Da kommt es aber auch wirklich auf µs an. In vielen Programmen braucht man das nicht

Zählen Computerspiele zu den Programmen, in denen das wichtig sein kann? Da habe ich nämlich lieber 25 als 20 FPS, da machen 25% viel aus.

Gibt es irgendwelche Tools, mit denen man sich die Assembler-Entsprechung von C++-Zeilen ansehen kann

Ja!

und dann dem Kompiler mitteilen kann, dass er in gewissen Zeilen das Assembler-Ergebnis anpassen soll?

Nein!
Aber du kannst eigenen Assembler Code einbauen!

combie:
Ja!

Bekommt man da kryptische Sprünge und alles ohne Labels, wie bei einem Disassembler, oder werden da dann mehr oder weniger sinnvolle Labels aus z.B. Funktionsnamen gezimmert?

combie:
Nein!
Aber du kannst eigenen Assembler Code einbauen!

Auch gut. Gibt es nicht auch ein Schlüsselwort für Assembler mittendrin? Das wurde, meine ich, in irgendeiner Adafruit-Display-Lib genutzt.

Suche nach "Gcc Inline Assembler"


Der generierte AsmCode vom Blink.ino Beispiel im Anhang
Kompiliert für einen UNO

Blink.ino.asm.txt (21.8 KB)

Das sieht extrem gut aus, vielen Dank! Wie sieht das denn mit Assembler mittendrin aus? Ich habe online das Schlüsselwort "asm" gefunden, das wird aber in der IDE nicht blau.

das wird aber in der IDE nicht blau.

Ja und?

Suche nach "Gcc Inline Assembler"
(da dreht es sich um C. In C++ ist das ganz ähnlich)

combie:
Ja und?

Ich kenne kein anderes Schlüsselwort, das nicht blau oder grün wird.

HTML-Fan:
Ich kenne kein anderes Schlüsselwort, das nicht blau oder grün wird.

Schön, dann ist das jetzt das erste!
(es wird nicht das letzte bleiben)

Okay, bei IRAM_ATTR ist das auch so, aber es ist selten und ich verlasse mich mehr oder weniger drauf, da ich mir denke, dass, wenn man das mit den viel genutzen Wörtern macht, man es auch mit den weniger genutzen erst recht macht.

Die "Bunten Erleuchtungen" sind in diversen keywords.txt Dateien gesammelt.
Hier mal eine davon
Niemand wird dich abhalten, diese zu verändern und zu publizieren.

Also, nicht jammern, sondern besser machen!

Es hat doch wahrscheinlich einen Grund, dass diese Wörter nicht mit dabei sind, oder (abgesehen davon, dass alle anderen das auch gedacht haben)?

HTML-Fan:
Es hat doch wahrscheinlich einen Grund, dass diese Wörter nicht mit dabei sind, oder?

Ja!
Der Grund ist:
Sie sind noch nicht aufgenommen worden, weil sie bisher noch niemand aufgenommen hat.

Zurück zur Frage. IMO ist es sehr selten sinnvoll, Code mit Assembler aufzupeppen. Wenn die Zeit oder der Speicher so knapp wird, daß sich solche Optimierungen überhaupt lohnen, dann sollte man rechtzeitig auf einen leistungsfähigeren Controller umsteigen.

Nach meiner Erfahrung mit mehreren Projekten haben Leute, die solche Mikro-Optimierungen in ihrem Code vorgenommen haben, an anderer Stelle weit mehr Platz und Zeit verdödelt als sich durch ein paar trickreiche Assembler-Einschübe aufholen lassen.

Ein Compiler kann nach jeder Änderung des Codes neu optimieren, und auch für einen anderen Controller.

Nach meiner Erfahrung mit mehreren Projekten haben Leute, die solche Mikro-Optimierungen in ihrem Code vorgenommen haben, an anderer Stelle weit mehr Platz und Zeit verdödelt als sich durch ein paar trickreiche Assembler-Einschübe aufholen lassen.

Dafür habe ich einen tollen Spruch auf Lager!
Den fand ich damals "angemessen".

Performancefrage

von wahsaga:
Forenposting mit Performancefrage Bewertungsfaustregel:
Wer Fragen nach der Performance solcher Kinkerlitzchen stellt, der programmiert vermutlich noch nicht mal ansatzweise performant. Andernfalls, wenn er wirklich und zu Recht an einer Applikation arbeiten würde, bei der dieses Quentchen entscheidend ist, sollte er diese Frage gar nicht mehr stellen müssen.

Eine Anwendung wo es assembler braucht ist WS2812 ansteuern. da muß das Timing auf 0,15µS genau sein. Obwohl mir schon einer gezeigt, hat daß das such mit C++ geht.

Grüße Uwe

Okay, also lieber C++ als Assembler optimieren.

HTML-Fan:
Okay, also lieber C++ als Assembler optimieren.

Öhhmmm....

Manche Annahmen, sind so dermaßen falsch, dass noch nicht mal das Gegenteil richtig ist.
(Aus der Ratgeber-Schriftrolle)

Ich habe es letztens geschafft, durch aufmotzen eines C++-Programmes mit Bitverschiebung die Oszillatoranzahl von 6 auf 16 erhöhen können.

Ich meine damit, es macht eher Sinn, sich ein effizienteres C++-Programm zuzulegen, als zu versuchen, den Assembler-Code zu optimieren.