interessanter Gesichtspunkt...
s ist ja immerhin volatile, also darf der Compiler diese Operation nicht wegoptimieren (was gpp sonst automatisch macht).
Dadurch wird das Shiften also keine Null- oder Leernummer.
Da müssen jetzt mal die hier einschlägig bekannten C/C++ Spezialisten etwas sagen... 
- - - Aktualisiert - - -
habe jetzt mal den Mess-Code per Zusatz-Variable auf einen gemeinsamen Nenner gestellt:
Code:
long test_Int_multdiv2() {
uint32_t x,y;
volatile uint32_t s,t;
for(y=0;y<10000;y++) {
s=11;
for(x=1;x<=16;x++) { t=s*2;}
for(x=16; x>0;x--) { t=s/2;}
s=7;
for(x=1;x<=8;x++) { t=s*8;}
for(x=8; x>0;x--) { t=s/8;}
}
return s;
}
long test_Int_shl_shr() {
uint32_t x,y;
volatile uint32_t s,t;
for(y=0;y<10000;y++) {
s=11;
for(x=1;x<=16;x++) { t=(s<<1);}
for(x=16; x>0;x--) { t=(s>>1);}
s=7;
for(x=1;x<=8;x++) { t=(s<<3);}
for(x=8; x>0;x--) { t=(s>>3);}
}
return s;
}
auch hier: beide identisch!
ARM Cortex M0
Code:
start test
0 93 Int_multdiv2
1 93 Int_shl_shr
AVR (Mega2560)
Code:
start test
0 1220 Int_multdiv2
1 1220 Int_shl_shr
Fazit:
wenn einfach nur eine Variable erhöht werden soll, ist shiften schneller als Multipl./Division.
Wenn aber Werte zugewiesen und damit weiter gerechnet werden soll, sind beide gleich schnell, und das war ja hier die vorrangige Fragestellung
Lesezeichen