Hallo zusammen,
in einem kleinen 8 Bitter ist eine Multiplikation ja nicht grad optimal, da sie in Software ausgeführt wird.
Wenn ich nun einen Wert mit 3 multiplizieren möchte, habe ich ja so einiges an Möglichkeiten.
Ich habe mal verschiedene Möglichkeiten compiliert und war doch sehr erstaunt über das Ergebnis:
Um den Compiler auszutricksen habe ich folgenden Code verwendet und genau der ist laufzeitmässig der absolut Schlechteste:
Compiler ist der XC8 Version V2.00
char cnt;
Code:
cnt = cnt + cnt + cnt; // 57 Zyklen
So wie ich es in Assembler gemacht hätte, hat auch der Compiler die beste Laufzeit.
Code:
cnt = (cnt << 1) + cnt; // 5 Zyklen
Hier mal die Übersicht:
Code:
cnt *=3; // 45 Zyklen
cnt = (cnt << 1) + cnt; // 5 Zyklen
cnt = cnt + cnt + cnt; // 57 Zyklen
cnt += (cnt + cnt); // 56 Zyklen
Ich möchte halt vermeiden, dass der schlaue C-Compiler mir eine Multiplikation erzeugt.
Kann man das noch irgendwie steuern ?
Siro
Wie so oft macht der C-Compiler nicht das was da steht, er konzentriert sich nur auf das Ergebnis. Hier fehlt eigentlich eine Option: Bitte das so kodieren wie es dort steht. Natürlich ironisch gemeint....
Lesezeichen