10 if besser als for mit je einem if?

OP #696473
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
Gast #696481
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 ;)
Gast #696485
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.
OP #696489
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
#696495
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
#696507
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren