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:
auch hier: beide identisch!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; }
ARM Cortex M0
AVR (Mega2560)Code:start test 0 93 Int_multdiv2 1 93 Int_shl_shr
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







Zitieren


Lesezeichen