www.mikrocontroller.net

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


Autor: Johannes Philippi (ohanica)
Datum:

Bewertung
0 lesenswert
nicht 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?
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;


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

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

Autor: Oliver D. (highspeed-oliver)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sphinx (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Stefan May (smay4finger)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die "for schleife" ist der bessere Stil und lesbarer.

Autor: Johannes Philippi (ohanica)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: I_ H. (i_h)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.