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


von Andre N. (fruchttiger)


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

von Benedikt K. (benedikt)


Lesenswert?

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

von Michael U. (amiga)


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

von yalu (Gast)


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.

von Andre N. (fruchttiger)


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

von Neubi (Gast)


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

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.