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


von emax (Gast)


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.

von Michael (Gast)


Lesenswert?

Das ist wohl auch Compiler-abhängig. Welchen Nimmst Du denn?

von emax (Gast)


Lesenswert?

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

gcc.

e.

von Peter D. (peda)


Lesenswert?

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

Peter

von emax (Gast)


Lesenswert?

da hilft auch kein cast?

von Jörg Wunsch (Gast)


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.

von ape (Gast)


Lesenswert?

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

von emax (Gast)


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.

von ape (Gast)


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)

von Florian Hrubesch (Gast)


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

von emax (Gast)


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?).

von Jörg Wunsch (Gast)


Lesenswert?

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

von Stefan Kleinwort (Gast)


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

von m@is (Gast)


Lesenswert?

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

m@is

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.