Morgen, mal ne frage, was geht schneller auf nem avr 8 bit: unsigned int j=(zahl<<1)-(i<<9); unsigned int j=(zahl-256*i)*2;
Ohne die Aequivalenz der Operationen vorauszusetzen natuerlich ersteres...
Seht doch einfach nach der Anzahl der Operatoren? Das reicht in dem Fall schon... Ich wünsche noch eine angenehme Nacht! Gruß Ovular
Jo, danke macht sinn. hab ja schon umgeformt ... wenn man die klammer auflöst steht da ja : 2*j-512*i
Äh, wenn man die klammer auflöst steht da ja : j= 2*zahl-512*j so gute nach :)
ja schon, aber zahl<<1 ist zahl*2 und j<<9 ist j*512 mir ist nicht klar ob der compiler oder wer auch immer, nicht auch einfach schiebt bei *2, warscheinlich schon oder?
Zweiteres ist schneller, einfach GCC fragen (hier avr-gcc 3.4.6, ATmega8, -Os) :-))
1 | unsigned int foo1 (unsigned int zahl, unsigned int i) |
2 | {
|
3 | return (zahl<<1)-(i<<9); |
4 | }
|
5 | |
6 | unsigned int foo2 (unsigned int zahl, unsigned int i) |
7 | {
|
8 | return (zahl-256*i)*2; |
9 | }
|
1 | foo1: |
2 | movw r18,r22 ; i, i ; 4 *movhi/1 [length = 1] |
3 | lsl r24 ; tmp45 ; 31 *ashlhi3_const/2 [length = 2] |
4 | rol r25 ; tmp45 |
5 | mov r19,r18 ; i ; 30 *ashlhi3_const/5 [length = 3] |
6 | clr r18 ; i |
7 | lsl r19 ; i |
8 | sub r24,r18 ; <result>, i ; 22 subhi3/1 [length = 2] |
9 | sbc r25,r19 ; <result>, i |
10 | ret |
11 | /* function foo1 size 9 (8) */ |
12 | |
13 | foo2: |
14 | movw r18,r22 ; i, i ; 4 *movhi/1 [length = 1] |
15 | mov r19,r18 ; tmp45, i ; 33 *ashlhi3_const/3 [length = 2] |
16 | clr r18 ; tmp45 |
17 | sub r24,r18 ; tmp47, tmp45 ; 14 subhi3/1 [length = 2] |
18 | sbc r25,r19 ; tmp47, tmp45 |
19 | lsl r24 ; <result> ; 32 *ashlhi3_const/2 [length = 2] |
20 | rol r25 ; <result> |
21 | ret |
22 | /* function foo2 size 8 (7) */ |
Kann er aber noch etwas besser (-Os -morder1):
1 | foo2: |
2 | mov r19,r22 ; tmp45, i ; 35 *ashlhi3_const/3 [length = 2] |
3 | clr r18 ; tmp45 |
4 | sub r24,r18 ; zahl, tmp45 ; 14 subhi3/1 [length = 2] |
5 | sbc r25,r19 ; zahl, tmp45 |
6 | lsl r24 ; <result> ; 34 *ashlhi3_const/2 [length = 2] |
7 | rol r25 ; <result> |
8 | ret |
9 | /* function foo2 size 7 (6) */ |
rechner wrote:
> aber was ist -morder1 ?
avr-gcc bietet 2 undokumentierte Optionen, welche die
Registerallokierung (d.h. Abbildung von pseudo-regs auf hard-regs)
beeinflussen. Neben der Standard-Rgisterreihenfolge gibt's noch -morder1
und -morder2 (zumindest in avr-gcc 3.4.x). Wahrscheinlich von Chertikov
zum Rumexperimentieren?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.