mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taktzyklen bzw. Effizienz von geschaltelten IF-Abfragen


Autor: Andre N. (fruchttiger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich würde gerne wissen welcher Programmcode "intellienter" ist.

Es geht dabei um IF-Abfragen mit meheren Parametern.
Sollte man alle Parameter in eine einzige Abfrage packen,
oder lieber im Extremfall jede Abfrage mit einer einzelnen If-Zeile
bearbeiten ?

Weiterhin ist mir nicht klar ob diese Fragestellung auch zusätzlich 
davon
abhängt um welche Datentypen es sich handelt.

Es geht mir dabei um die Taktzyklen die ein ATMega128 unnötig 
"verbraucht" (vermute ich zumindest).

Pseudocode 1.
if ((a = 5) && (b > 6) && (b < 10)
{
   printf("Hello World");
}


Pseudocode 2.
if (a=5)
{
   if (b > 6)
   {
       if (b < 10}
       {
           printf("Hello World");
       }
   }
}

Für die folgende Überlegung nehme ich Werte an,
die bei mir überwiegend Anzutreffen sein werden:
Ausdruck a wird True (a=5)
Ausdruck b wird beides mal False (z.B. b=15)

Im ersten Code-Beispiel würde der µC nur mit der Kontrolle der drei
Parameter beschäftig sein, während er beim zweiten Beispiel den ersten 
Parameter prüft (a=5 -> True), dann zur nächten IF-Abfrage springt diese 
auch prüft (b>6 -> True) und schließlich bei der letzten Prüfung 
abbricht da (b <10 -> False).

Da der Compiler evtl. nicht ganz unbeteiligt sein wird:
Ich benutze WinAVR.

Die Suche bei google hat mich irgendwie nicht weitergebracht und auch 
hier im Forum habe ich auf diese spezielle Frage noch keinen Hinweis 
gefunden.

Interessant wäre noch zu wissen ob mein geschildertes Problem ein ATmega 
unabhäniges ist und es ganz allgemein dabei um effiziente 
Programmiertechniken geht ?
Also wenn Pseudocode 1 die erste wahl für einen ATmega ist, ist es dann 
auch automatisch die erste Wahl für einen x86 (Pentium, AMD was auch 
immer) ?
Und wenn es sich ausschließlich um allgemeingültige Tipps für effiziente 
Programmiertechniken handelt, hat jemand dazu eine Buch-Empfehlung ?

viele Grüße
Andre

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler macht intern Version 1 zu Version 2. Es dürfte also beides 
gleich lange dauern.

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

naja, grundsätzlich sollten 2 Dinge da reinspielen: der Compiler und die 
benutzte CPU.
Der Compiler sollte so gut optimieren, daß der für die CPU günstigste 
Code erzeugt wird, der das gewünschte Ergebnis erzeugt.
Das andere Problem ist es, wenn es bestimmte Funktionen auf 
Hardwareebene nicht gibt. Einige AVR haben z.B. keinen MUL-Befehl, so 
daß der Compiler den Kram in Software machen muß.

Das wird aber wohl immer speziell sein und bleiben, Abhilfe schafft hier 
normalerweise wohl nur die Kenntnis über die konkrete Hardware, bei µC 
halte ich das für wichtig, auf einem P4 würde ich da wohl erst drüber 
nachdenken, wenn es zeitkritisch wird oder sehr oft benutzt werden muß.

Gruß aus Berlin
Michael

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schließe mich der Meinung von Benedikt K. an: Beide Varianten
unterscheiden sich nur leicht in der Syntax. Spätestens nach der
Zwischencodegenerierung und noch vor irgendwelchen Optimierung-
schritten sehen beide exakt gleich aus. Und das gilt ziemlich sicher
für alle C-Compiler.

Fast alle C-Compiler werden übrigens die erste Abfrage wegoptimieren,
da sie immer wahr ist.

Autor: Andre N. (fruchttiger)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank für die Kommentare.

In anderen Threads gab es schon öfter mal den Hinweis sich das 
Assemblerlisting anzusehen.

Ich hab mal beide IF-Versionen jeweils in ein eigenes neues Projekt 
gepackt und Compilieren lassen.
Auch wenn ich kein Assemblerfreak bin, konnte man sehr schön sehen
das der Compiler aus beiden Versionen Exakt den gleichen Code macht.
Sozusagen aufs Bit genau.
Damit lässt sich Benedikts Vorhersage bestätigen.

Bleibt noch die Frage nach Büchern zu effizienten Programmiertechniken.
Auch wenn die IF-Abfrage jetzt gelöst ist kommen doch noch hier und da
zweifel auf ob man das ein oder andere nicht "Intelligenter" tippen 
könnte...


Danke
Andre

Autor: Neubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
am genauesten weist du es, wenn du den compilierten code(asm) anschaust 
und per simulator die taktzyklen vergleichst ... oftmals hilft eine 
leichte umstellung des c-codes, dass der compiler deine c-syntax 
effizienter auflösen/umsetzen kann !!


Neubi

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.