Mit AVR-GCC was ist schneller mit Ganzzahlen? if (x >= 5) ... oder if (x > 4) ... oder ist gleichwertig, weil der Compiler optimiert (Flag nötig?) PS: Bitte keine spekulativen "Meinungen" posten, oder "probiers doch aus". Wissen ist gefragt, und das fehlt mir leider in diesem Punkt.
:
Verschoben durch Moderator
Naja es ist eindeutig ! Hier das Ergebnis für 8-Bit
1 | volatile uint8_t x, y; |
2 | volatile uint8_t d = 0; |
3 | 40: 1b 82 std Y+3, r1 ; 0x03 |
4 | |
5 | x = 1; |
6 | 42: 91 e0 ldi r25, 0x01 ; 1 |
7 | 44: 99 83 std Y+1, r25 ; 0x01 |
8 | y = 1; |
9 | 46: 9a 83 std Y+2, r25 ; 0x02 |
10 | |
11 | if (x >= 5) |
12 | 48: 89 81 ldd r24, Y+1 ; 0x01 |
13 | 4a: 85 30 cpi r24, 0x05 ; 5 |
14 | 4c: 08 f0 brcs .+2 ; 0x50 <__SREG__+0x11> |
15 | {
|
16 | d = 1; |
17 | 4e: 9b 83 std Y+3, r25 ; 0x03 |
18 | }
|
19 | |
20 | |
21 | if (y > 4) |
22 | 50: 8a 81 ldd r24, Y+2 ; 0x02 |
23 | 52: 85 30 cpi r24, 0x05 ; 5 |
24 | 54: 10 f0 brcs .+4 ; 0x5a <__SREG__+0x1b> |
25 | {
|
26 | d = 2; |
27 | 56: 82 e0 ldi r24, 0x02 ; 2 |
28 | 58: 8b 83 std Y+3, r24 ; 0x03 |
und so sieht das C-Programm aus:
1 | int main (void) |
2 | {
|
3 | volatile uint8_t x, y; |
4 | volatile uint8_t d = 0; |
5 | |
6 | x = 1; |
7 | y = 1; |
8 | |
9 | if (x >= 5) |
10 | {
|
11 | d = 1; |
12 | }
|
13 | |
14 | |
15 | if (y > 4) |
16 | {
|
17 | d = 2; |
18 | }
|
19 | |
20 | for (;;) |
21 | {
|
22 | }
|
23 | |
24 | }
|
Wenn der Datentyp für x,y int ist, dann macht das mein GCC wie folgt:
1 | volatile int x, y; |
2 | volatile uint8_t d = 0; |
3 | 42: 19 82 std Y+1, r1 ; 0x01 |
4 | |
5 | x = 1; |
6 | 44: 81 e0 ldi r24, 0x01 ; 1 |
7 | 46: 90 e0 ldi r25, 0x00 ; 0 |
8 | 48: 9b 83 std Y+3, r25 ; 0x03 |
9 | 4a: 8a 83 std Y+2, r24 ; 0x02 |
10 | y = 1; |
11 | 4c: 9d 83 std Y+5, r25 ; 0x05 |
12 | 4e: 8c 83 std Y+4, r24 ; 0x04 |
13 | |
14 | if (x >= 5) |
15 | 50: 8a 81 ldd r24, Y+2 ; 0x02 |
16 | 52: 9b 81 ldd r25, Y+3 ; 0x03 |
17 | 54: 05 97 sbiw r24, 0x05 ; 5 |
18 | 56: 14 f0 brlt .+4 ; 0x5c <__SREG__+0x1d> |
19 | {
|
20 | d = 1; |
21 | 58: 81 e0 ldi r24, 0x01 ; 1 |
22 | 5a: 89 83 std Y+1, r24 ; 0x01 |
23 | }
|
24 | |
25 | |
26 | if (y > 4) |
27 | 5c: 8c 81 ldd r24, Y+4 ; 0x04 |
28 | 5e: 9d 81 ldd r25, Y+5 ; 0x05 |
29 | 60: 05 97 sbiw r24, 0x05 ; 5 |
30 | 62: 14 f0 brlt .+4 ; 0x68 <__SREG__+0x29> |
31 | {
|
32 | d = 2; |
33 | 64: 82 e0 ldi r24, 0x02 ; 2 |
34 | 66: 89 83 std Y+1, r24 ; 0x01 |
35 | }
|
Hallo, ich habe es mal ausprobiert. Bei beiden Fällen hat der Compiler bei mir ein
1 | CPI R24,0x05 |
daraus gemacht und auch sonst war der Rest gleich. Optimierung stand auf -Os. Meine Antwort zur Frage also nein. Was anderes hätte mich aber auch gewundert.
>PS: Bitte keine spekulativen "Meinungen" posten, oder "probiers doch aus".
Dir ist aber schon klar, dass die anderen jetzt genau das gemacht haben:
einfach ausprobiert.
Der Vergleich zwischen int a (int a, int b) { return (a > b) } int b (int a, int b) { return (a >= b) } ist eigentlich interessanter.
Bartli schrieb: > dass die anderen jetzt genau das gemacht haben Und genau daruf kommts an. Das erleichtert einem das Leben ungemein... ;-)
Bartli schrieb: > Dir ist aber schon klar, dass die anderen jetzt genau das gemacht haben Dir ist aber hoffentlich auch klar, dass es einen Unterschied macht, ob man dem Fragesteller das Probieren selbst überlässt (was er wohl nicht selbst konnte), oder ihm ein hilfreiches Beispiel zeigt?
Tja, dann hat er jetzt nicht viel gelernt, weil dem armen Kerl niemand mitgeteilt hat wie man an gcc's Assembleroutput rankommt.
Klugscheisser schrieb: > Dir ist aber hoffentlich auch klar, dass es einen Unterschied macht, ob > man dem Fragesteller das Probieren selbst überlässt (was er wohl nicht > selbst konnte), oder ihm ein hilfreiches Beispiel zeigt? Warum sollte man, schließlich lässt seine Aussage darauf schließen, dass er ohnehin nichts lernen will.
Bartli schrieb: > wie man an gcc's Assembleroutput rankommt gcc -S -o asm_output.s quellcode.c Vermutlich wolltest Du es selber wissen :-)
gaast schrieb: > Warum sollte man, schließlich lässt seine Aussage darauf schließen, dass > > er ohnehin nichts lernen will. Und wie kommst Du zu Deiner Hypothesenbildung? Berufsspekulant?
War nicht nötig. Soll sich ja nicht nur leeres Gequatsche hier anhäufen ... Bartli schrieb: > Bist du das jetzt extra im gcc Manual nachschlagen gegangen?
>Soll sich ja nicht nur leeres Gequatsche hier anhäufen.
Na dann geh noch mit gutem Beispiel voran und hör auf damit, wenns dich
so beelendet.
Bartli schrieb: > Na dann geh noch mit gutem Beispiel voran und hör auf damit, wenns dich > > so beelendet. Wie wäre es damit, selbst ein gutes Beispiel abzugeben, anstatt es von anderen zu fordern?
Na du bist ja ein Scherzkeks. Merkst du eigentlich wie du selber Wasser
predigst und Wein säufst?
Hier
>Vermutlich wolltest Du es selber wissen :-)
unterstellst du mir ich würde -S nicht kennen und kurze Zeit später
bezeichnest du andere Leute als Berufsspekulant...
Hast Du die Fragezeichen übersehen? Kann ja passieren, so wie Du drauf bist ... Mal sehen was Du noch an Erkenntnisgewinn zu bieten hast ...
Klugscheisser schrieb: > Und wie kommst Du zu Deiner Hypothesenbildung? Berufsspekulant? Man(n) weis wieder nix schrieb: > PS: Bitte keine spekulativen "Meinungen" posten, oder "probiers doch > aus". Wissen ist gefragt, und das fehlt mir leider in diesem Punkt. Offenbar ist er nicht willens, sich das Wissen, das ihm nach eigener Aussage fehlt, anzueignen. Und nun troll dich.
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.