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++:
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
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?
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
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?
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.
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.
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.