www.mikrocontroller.net

Forum: Compiler & IDEs was ist effizienter, case oder if?


Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Methode zur Fallabfrage gebt Ihr den Vorzug: "case" oder
"if"?

Ich bin nicht der Beste in Assembler, aber ich habe den Eidruck, dass
"case" mehr overhead verursacht.

Also: was ist

1. schneller
2. kompakter

Wer kann was dazu sagen?

e.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist wohl auch Compiler-abhängig. Welchen Nimmst Du denn?

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Ich denke, das ist hier das (avr/msp) - GCC Forum?

gcc.

e.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der WINAVR macht leider die switch Anweisung nur 16-bittig.
Somit ist es auf Byte-Variablen sehr ineffizient.

Peter

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da hilft auch kein cast?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter, Du bist lange genug dabei, um hier nicht weiter zur
Begriffsverwirrung beitragen zu müssen.

Der Compiler heißt AVR-GCC.

WinAVR heißt das Windows-Paket, das ihn zusammen mit paar anderen für
den Zweck nützlichen Tools in einem gemeinsamen Installer anbietet.

Nein, typecast hilft da nicht, der Steuerausdruck eines case ist per
definitionem ein `int'.  -mint8 hilft, aber macht einen ziemlich
inkompatibel zur Standardbibliothek.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einigermaßen nutzloser beitrag meinerseits:
ich find if ... else if sowieso hübscher :)

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, ja.

Aber die Frage ist für mich noch nicht ganz beantwortet.
Hübscher oder nicht - ok, das ist eine Sache. Aber ich will keinen
Schönheitswettbewerb gewinnen. Ich möchte so ressourcenschonend wie
möglich programmieren.

Im vorliegenden Fall habe ich -leider- ca. 50 (!) Cases in einem
einzigen switch zu unterscheiden.

Und da lohnen sich ein paar Gedanken schon.

Ich überlege auch, ob es sinnvoll ist, die cases (wenn man sie den
vewendet) in sortierter Reihenfolge zu kodieren. Hab' ja keine Ahnung,
ob das dem Compiler die Denke oder das Optimieren erleichtert...

e.

Autor: ape (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nagut aber meine vorredner sagten ja schon das if else wohl resourcen
schonender sein dürfte abgesehen davon kannste das doch auch
ausprobieren. was mehr speicherplatz einnimmt sieht man nachm
kompilieren und was zur laufzeit shcneller is angut da muss man schon
etwas tiefer in die trickkiste greifen. wenn man kein oszilloskop zur
hand hat müsstes auch nen timer vom avr tun timer anmachen einmal durch
den switch durch timer ausmachen wert übers uart ausgeben (oder lcd
oder sonstwas)

Autor: Florian Hrubesch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 50 möglichkeiten wär ich mir da nicht so sicher.
Du arbeitest nämlich bei if alle 50 durch unabhängig davon ob die
Lösung schon gefunden wurde.
switch hört auf wenn es die richtige Antwort gefunden hat.
Das kann bei 50 schon was bringen.
Von der rechenzeit her könnte man ja mal nen simulator testen, obwohl
ich den Dingern ned so ganz trau;)
cu Flo

Autor: emax (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
" Du arbeitest nämlich bei if alle 50 durch unabhängig davon ob die
Lösung schon gefunden wurde."

Nö, eigentlich nicht:

if (x == y) { blah }
else if (y == z) { blah }
else if ....

Das "else" schickt die Verarbeitung ans Ende. Denn nach dem  ersten
erfolgreichen Vergleich ist Schluss.

BIS DAHIN allerdings macht er alle Vergleiche durch. Wie ist denn das
bei "case"? Macht nicht der Compiler letztlich auch eine interne
if/else-if Struktur draus?

Ich könnte das natürlich byte für byte im Assembler studieren. Aber ich
hab' ja schon gesagt, dass Assembler nicht so mein Ding ist, ich tu
mich da schwer. Meine Hoffnung war, dass diese Frage von einigen schon
grundsätzlich durchleuchtet wurde (warum dann das Rad zwei mal
efinden?).

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
case kann aber in solchen Fällen eine Sprungtabelle anlegen.  Das
könnte, wenn schon nicht codesparender, zumindest schneller sein.

Autor: Stefan Kleinwort (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 50 Einträgen würde ich auch auf eine Sprungtabelle gehen. Wenn case
die selber macht, umso besser. Du kannst sie aber auch selber
zusammenbasteln, das Sprungziel ist in diesem Fall aber immer eine
eigene Funktion.

Weiterer Nebeneffekt: der Code wird richtig schön überschaubar.

Stefan

Autor: m@is (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
beim msp habe ich mit der case-Anweisung eine fixe Sprungtabelle
bekommen, if-else-if-Anweisung war wesentlich langsamer.

m@is

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.