was ist effizienter, case oder if?

Gast #76679
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.
Gast #76681
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.
Gast #76682
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)
Gast #76683
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
Gast #76684
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?).
Gast #76686
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren