Forum: Compiler & IDEs AVR-GCC: Ist > schneller als >=?


von Man(n) weis wieder nix (Gast)


Lesenswert?

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
von Uwe (de0508)


Lesenswert?

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
}

von Uwe (de0508)


Lesenswert?

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
   }

von Man(n) probiert es dann aus (Gast)


Lesenswert?

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.

von Man(n) weis wieder nix (Gast)


Lesenswert?

D A N K E !!

von Bartli (Gast)


Lesenswert?

>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.

von ed (Gast)


Lesenswert?

Der Vergleich zwischen

int a (int a, int b)
{
  return (a > b)
}

int b (int a, int b)
{
  return (a >= b)
}

ist eigentlich interessanter.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bartli schrieb:
> dass die anderen jetzt genau das gemacht haben
Und genau daruf kommts an. Das erleichtert einem das Leben ungemein... 
;-)

von Klugscheisser (Gast)


Lesenswert?

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?

von Bartli (Gast)


Lesenswert?

Tja, dann hat er jetzt nicht viel gelernt, weil dem armen Kerl niemand 
mitgeteilt hat wie man an gcc's Assembleroutput rankommt.

von Klugscheisser (Gast)


Lesenswert?

Mag sein, aber was treibt Dich zu solchen Bemerkungen?

von gaast (Gast)


Lesenswert?

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.

von Klugscheisser (Gast)


Lesenswert?

Bartli schrieb:
> wie man an gcc's Assembleroutput rankommt

gcc -S -o asm_output.s quellcode.c

Vermutlich wolltest Du es selber wissen :-)

von Bartli (Gast)


Lesenswert?

Bist du das jetzt extra im gcc Manual nachschlagen gegangen?

von Klugscheisser (Gast)


Lesenswert?

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?

von Klugscheisser (Gast)


Lesenswert?

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?

von Bartli (Gast)


Lesenswert?

>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.

von Klugscheisser (Gast)


Lesenswert?

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?

von Bartli (Gast)


Lesenswert?

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...

von Klugscheisser (Gast)


Lesenswert?

Hast Du die Fragezeichen übersehen? Kann ja passieren, so wie Du drauf 
bist ...

Mal sehen was Du noch an Erkenntnisgewinn zu bieten hast ...

von gaast (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.