Forum: Compiler & IDEs If-Vergleich - was ist schneller


von Sebastian L. (sebastian_l)


Lesenswert?

Hallo zusammen,

ich programmiere auf einen Fujitsu 16FX (16 bit) und habe eine (kleine) 
grundsätzliche Frage - welche der beiden folgenden Vergleiche ist 
schneller ? Ich stelle mir die Frage deshalb, weil im ersten Beispiel 
ein exakter-, im zweiten ein "range"-Vergleich (">") gemacht wird. Der 
erste ist aufgrund der else-Bedingung (genau die brauche ich) unschöner, 
könnte mir aber vorstellen, dass die schneller ist !?
1
if ((l_cnt==0) && (l_ovl==0)) {
2
  // nix machen, der Timer ist abgelaufen
3
} else {
4
  // mach was, der Timer ist noch nicht abgelaufen
5
  [....]
6
}
1
if ((l_cnt>0) || (l_ovl>0)) {
2
  // mach was, der Timer ist noch nicht abgelaufen
3
  [....]
4
}

Danke,
Sebastian

von (prx) A. K. (prx)


Lesenswert?

Wenn es auf den letzten Takt ankommt, dann nützen dir keine allgmeinen 
Regeln mit Ausnahmen, sondern nur der konkrete Code. Also schau dir das 
Ergebnis vom Compiler an.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn dir das else zu "unschön" ist, dann schreib doch
1
if (!(l_cnt == 0 && l_ovl == 0))
oder
1
if (l_cnt != 0 || l_ovl != 0)
oder
1
if (l_cnt || l_ovl)
oder...

von (prx) A. K. (prx)


Lesenswert?

Die Chancen stehen übrigens nicht schlecht, dass du mit der weniger 
eleganten Version if(l_cnt|l_ovl) besser fährst als mit den beiden 
Varianten oben (unter der Annahme, dass die Vars vorzeichenlos sind, 
andernfalls wären deine Varianten nicht äquivalent).

von Rolf M. (rmagnus)


Lesenswert?

Ich würde erwarten, daß beide gleich schnell sind. Es ist recht 
wahrscheinlich, daß der generierte Code exakt gleich ist.

Sebastian L. schrieb:
> Ich stelle mir die Frage deshalb, weil im ersten Beispiel
> ein exakter-, im zweiten ein "range"-Vergleich (">") gemacht wird.

Und? Ich kenne jetzt den Prozessor nicht, aber warum sollten die 
unterschiedlich schnell sein?

von Sebastian L. (sebastian_l)


Lesenswert?

Hallo zusammen,

interessantes Thema offensichtlich. Wahrscheinlich nützt wirklich nur 
der Blick in das übersetzte Programm - mache ich kommende Woche mal.

Warum ich auf die Idee gekommen bin, dass ein Range-Vergleich langsamer 
sein könnte ? Auch wenn es nicht wirklich vergleichbar ist (ja, ich 
weiss ;-) - bei MySQL (Datenbankserver) ist es so - da werden allerdings 
nicht unmittelbar Variabeln vergleichen, sondern Datensätze.

Grüße,
Sebastian

von (prx) A. K. (prx)


Lesenswert?

Es gibt gibt tatsächlich Situationen, in denen < aufwendiger ist als ==, 
und zwar bei Werten mit Vorzeichen und nicht ausgerechnet mit 0. Manche 
Architekturen besitzen die dafür nötigen Vergleichsoperationen oder 
Sprungbedingungen nicht (z.B. 8051).

Dein SQL Vergleich hinkt nicht mehr, der kriecht nur noch.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

A. K. schrieb:
> Die Chancen stehen übrigens nicht schlecht, dass du mit der weniger
> eleganten Version if(l_cnt|l_ovl) besser fährst

Ist aber nicht gleichbedeutend mit if (l_cnt || l_ovl), zumindest wennes 
um C/C++ geht: Falls l_ovl volatile ist, darf es nur ausgewertet werden, 
wenn l_cnt false ist. Für l_cnt | l_ovl ist das anders, hier muss l_ovl 
immer ausgewertet werden, damit die durch volatile angezeigten 
Seiteneffekte zustande kommen.

von (prx) A. K. (prx)


Lesenswert?

Johann L. schrieb:

> Ist aber nicht gleichbedeutend mit if (l_cnt || l_ovl), zumindest wennes
> um C/C++ geht: Falls l_ovl volatile ist, darf es nur ausgewertet werden,
> wenn l_cnt false ist.

Yep, wird hier aber höchstwahrscheinlich keine Rolle spielen, selbst 
wenn die Vars volatile sind.

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.