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
Der Compiler macht intern Version 1 zu Version 2. Es dürfte also beides gleich lange dauern.
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.