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.
Hm. Ich denke, das ist hier das (avr/msp) - GCC Forum? gcc. e.
Der WINAVR macht leider die switch Anweisung nur 16-bittig. Somit ist es auf Byte-Variablen sehr ineffizient. Peter
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.
einigermaßen nutzloser beitrag meinerseits: ich find if ... else if sowieso hübscher :)
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.
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)
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
" 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?).
case kann aber in solchen Fällen eine Sprungtabelle anlegen. Das könnte, wenn schon nicht codesparender, zumindest schneller sein.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.