Forum: Mikrocontroller und Digitale Elektronik 10 if besser als for mit je einem if?


von Johannes P. (ohanica)


Lesenswert?

Hallo zusammen!

ich habe eine Applikation in der ich 10 Werte eines Vektors regelmäßig 
überprüfen muss. Die Applikation läuft auf einem 8bit-uC, leider nicht 
ATMEL, sondern freescale.

was ist effizienter?
1
if (Wert[0] > Limit || Wert[1] > Limit || Wert[2] > Limit || Wert[3] > Limit ||
2
    Wert[4] > Limit || Wert[5] > Limit || Wert[6] > Limit || Wert[7] > Limit ||
3
    Wert[8] > Limit || Wert[9] > Limit )
4
    changeMyState = newState;

oder doch lieber
1
  for (i=0; i<=9; i++)
2
       if (Wert[i] > Limit) 
3
         {
4
          changeMyState = newState;
5
          break;
6
         }

Bei welchem der Werte die Bedingung auftritt ist völlig zufällig.

Was wird hier standardmässig für ein Programmierstil verwendet?

mit Grüßen und bestem dank für Tipps,
Johannes

von Oliver D. (highspeed-oliver)


Lesenswert?

Probiers doch mal aus ;)

Wenn du es in assembler schreiben würdest, könnte man dir mit sicherheit 
anhand des datenblattes helfen... So, wird es wohl auch auf deinen 
compiler an kommen, wie er es übersetzt.

von Sphinx (Gast)


Lesenswert?

Ich denke die for Schleife ist einfach übersichtlicher und lesbarer.
Daher würde ich die for Schleife preferieren.

Bei wirklich extremen Platzproblemen kann man sich ja den Assemblercode 
angucken, den der Compiler aus den beiden Varianten generiert und die 
kürzere Version verwenden.
Meiner Meinung nach sind solche Mikrooptimierungen allerdings den 
Aufwand nicht wert. Nichtmal im uC Bereich.

Ich vote mal für die for Schleife ;)

von Stefan M. (Gast)


Lesenswert?

Also an Deiner Stelle würde ich mir zu zwei Sachen Gedanken machen:

1) Welcher Code ist leichter zu verstehen? Ich würde die zweite Variante 
leichter finden. Ist aber Geschmackssache.

2) Was willst Du optimieren? Speicher oder Geschwindigkeit? Speicher ist 
wahrscheinlich Variante 2 optimaler. Bei der Geschwindigkeit kommt es 
sehr drauf an, was der Compiler daraus macht.

mfg, Stefan.

von andreas (Gast)


Lesenswert?

die "for schleife" ist der bessere Stil und lesbarer.

von Johannes P. (ohanica)


Lesenswert?

der uC ist ein HC08DZ60 von freescale. Compiler ist der in CodeWarrior 
standardmässig eingebundene (weis nicht wie der heisst).

Übersichtlicher ist die for-schleife... die wird wohl das Rennen machen. 
wie ich das sehe.

Werd mir mal den Assemblercode anschauen und dann entscheiden.

Gruß,
Johannes

von Falk B. (falk)


Lesenswert?

@ Johannes Philippi (ohanica)

>überprüfen muss. Die Applikation läuft auf einem 8bit-uC, leider nicht
>ATMEL, sondern freescale.

Na und? Die haben auch sehr gute uCs.

>was ist effizienter?

Was ist effizient für dich? Minimaler Programmspeicher oder Laufzeit?

>if (Wert[0] > Limit || Wert[1] > Limit || Wert[2] > Limit || Wert[3] > Limit ||
>    Wert[4] > Limit || Wert[5] > Limit || Wert[6] > Limit || Wert[7] > Limit ||
>    Wert[8] > Limit || Wert[9] > Limit )
>    changeMyState = newState;

Das wird der Compiler wahrscheinlich in einen relativ grossen Block mit 
10 Abfragen umsetzen, durch die festen Indizes recht schnell. Braucht 
aber relativ viel Platz.

>  for (i=0; i<=9; i++)
>       if (Wert[i] > Limit)
>         {
>          changeMyState = newState;
>          break;
>         }

Braucht wahrscheinlich weniger Programmspeicher, ist aber ggf. einen 
Tick langsamer.

>Was wird hier standardmässig für ein Programmierstil verwendet?

Das schöne an Standards ist, dass jeder seienen eigenen hat ;-)
Beide Wege sind OK.

MFG
Falk

von I_ H. (i_h)


Lesenswert?

Guck dir mal den Befehlssatz an, wenn da Instruktionen sind, die je nach 
Ausgang der Operation einfach einen Wert in ein Register schreiben (wie 
zB. bei MIPS), ist der große Block schneller.

Die for-schleife ist aber mit großer Wahrscheinlichkeit eh langsamer, 
auch wenn's so'ne Instruktion nicht gibt. Loop Unrolling macht der 
Compiler mit ziemlicher Sicherheit nicht, wär auf'm uC auch ziemlich 
dämlich.


Wenn's wirklich kritisch ist, entscheide dich für das schnellere. Aber 
wirklich kritisch ist es wahrscheinlich sowieso nicht.

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.