Dilemma: Code duplizieren oder if statement in loop

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Dilemma: Code duplizieren oder if statement in loop

Beitrag von starcow »

Tut mir Leid, irgendwie wollte mir einfach kein besserer Titel einfallen :-)

Ich stosse gelegentlich auf ein (irgendwie faszinierendes) Dilemma:
Vielleicht kennt ihr solche Situationen und habt da irgendein Rezept, auf das ich noch nicht gekommen bin.

Es geht darum, dass ich in einer Schleife einen Teil habe, der immer ausgeführt werden soll und ein anderer, der an eine Bedingung geknüpft ist.
Allerdings ist es so, dass der Wert, der die Bedingung steuert, nur einmal initial festgelegt wird und sich danach über alle Schleifeniterationen nicht mehr ändert.
Natürlich wird (muss) jetzt aber trotzdem in jedem Schleifendurchgang eine Auswertung des if-statements erfolgen.

Ist das tatsächlich so, dass man hier nur mittels Codeduplikation entgegenwirken kann (was ich nicht so schön fände)?
Oder übersehe ich da vielleicht eine bessere Möglichkeit.

In Assembly könnte man ja einmal die Sprungmarke ausrechnen und danach immer - und ohne compare - an die entsprechende Stelle springen.
Aber in C(++) scheint das irgendwie nicht möglich zu sein.
Auch mit goto kann ich bekanntlich nur an "konstante" Labels springen. Ich kann also das Label vorher nicht "ausrechnen".

Beispiel

Code: Alles auswählen

 
for(int i = 0; i < count; ++i)
{
    // Block A) der immer ausgeführt wird.
    // Berechnungen, deren Resultate im condition Block später benötigt werden.
    
    // condition wird in jedem Schleifendurchgang geprüft, was eigentlich nicht nötig wäre
    if(condition) // condition steht beim Eintritt in die Funktion fest und ändert sich danach nicht mehr
    {
      // Block B)
      // Resultate von Block A) werden benötigt.
    }
}

Code: Alles auswählen

if(condition) for(int i = 0; i < count; ++i)
{
    // Block A)
}
else for(int i = 0; i < count; ++i)
{
    // Block A) // Codeduplikation von oberhalb
    // Block B)
}
Irgendwie fasziniert mich das Problem, weil ich bislang dachte, dass es keine Situation gäbe, in dem Assembly Code "strukturell" C Code überlegen sein kann.

Ist das Problem irgendwie bekannt?

Edit:
In der Theorie könnte man wohl den zu ausführenden Maschinencode an der Stelle dynamisch erzeugen.
Das kommt mir aber irgendwie kriminell vor und vermutlich dürfte das OS entschieden etwas gegen solche Versuche haben. :-)
Zuletzt geändert von starcow am 17.11.2024, 18:20, insgesamt 1-mal geändert.
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von TomasRiker »

Du kannst natürlich Block A in eine Funktion auslagern, dann hast du so gut wie keinen duplizierten Code. Wenn der Compiler es für sinnvoll hält (ggf. auch mit Profile guided optimization), kann er die Funktion ja inlinen.
Zuletzt geändert von TomasRiker am 14.11.2024, 21:19, insgesamt 1-mal geändert.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Krishty »

In C++ kannst du die Bedingung als constexpr-Variable oder Template-Parameter definieren und dann ein if constexpr darauf machen. Das wird komplett wegoptimiert.

Das Transponieren der Schleifen ist ein großes Problem im Compilerbau und ich weiß von Visual Studio, dass sie es erst um 2019 eingeführt haben, und dann auch nur für sehr einfache Schleifen. Vielleicht ist die Optimierung mittlerweile besser, ich weiß es nicht.

Es ist vom Performance-Standpunkt auch in erster Linie ein Cache-/Decoding-Problem, da die Sprungvorhersage konstante Sprünge ziemlich gut vorhersagen kann.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von TomasRiker »

Krishty hat geschrieben: 14.11.2024, 21:17 In C++ kannst du die Bedingung als constexpr-Variable oder Template-Parameter definieren und dann ein if constexpr darauf machen. Das wird komplett wegoptimiert.
Er sagt es zwar nicht, aber ich vermute, dass sich die Bedingung zur Laufzeit ändert und nicht schon zur Compilezeit feststeht.
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von starcow »

Interessant, danke für die Vorschläge!

In Block B) brauche ich einige Werte, die zuvor in Block A) berechnet wurden. Wenn ich das ganze in eine Funktion auslagere, müsste ich allerdings einiges "hin und her" schleppen (in C++ ginge es ja per reference).
Aber inline ist ein interessanter Gedanke. Da könnte man vielleicht etwas forcieren, dass der Compiler von sich aus nicht für nötig hält.

Und ja, Tomas hat das richtig antizipiert! Ob B) ausgeführt werden soll, steht erst zur runtime fest, nicht bereits zur compile time.
Genauer gesagt ist es ein Flag in einem Funktionsparameter, der bestimmt, ob B) auch noch ausgeführt werden soll.

Ist das Flag gesetzt, wird Text und Farbinformation für die Buchstaben in einen Buffer kopiert.
Ist das Flag nicht gesetzt, wird nur der Text kopiert und die Farbinformationen bleiben "default" (und werden nicht kopiert).
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Alexander Kornrumpf »

Die "Schule" von der ich glaube, dass wir sie hier im Forum verfolgen, sagt "duplizieren" oder halt wie David sagt, simpler Weise eine Funktion für den gemeinsamen Teil aufrufen.

Von Mike Acton ("last minute decision making") über alles was Casey Muratori je veröffentlicht hat bis hin zu diesem The wrong abstraction wo ich mir ziemlich sicher bin, dass ich das zum ersten Mal hier im Forum verlinkt bekommen hatte. Es gibt auf youtube auch einen Talk "if considered harmful" in Anlehnung an das berühmte "goto considered harmful" den ich nicht verlinke weil der Talk selbst leider nicht so gut ist wie der Titel lustig ist aber die Idee ist sehr stark.

Die Daumenregel, die natürlich nicht immer gilt ist, je weiter außen das if ist, desto besser.

Ich kann anekdotisch aus Produktionscode berichten, dass aus 5 oder 6 Aufrufen tiefen Callstacks öfter mal eher so 5 oder 6 Zeilen (Tiefe: 1!) übrig bleiben, wenn man Code für genau den Fall schreibt, von dem man eigentlich schon wissen könnte, dass man in ihm ist, und nicht Code der 2^Anzahl der If statements viele Fälle behandeln kann von denen man 2^n-1 jetzt gerade bekannter Weise nicht braucht.

Das ist jetzt so die Art von Advice, die man leicht falsch verstehen kann (schönen Gruß an die Recruiter die meinen Namen gegooglet haben an der Stelle) aber der verlinkte Artikel erklärt es eigentlich ganz gut.
Benutzeravatar
Schrompf
Moderator
Beiträge: 5040
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Schrompf »

Tatsächlich gibt's dazu viele Meinungen, und vieles wurde schon gesagt. Ich möchte dem noch Kontext / Perspektive hinzufügen.

Wenn das einfach nur Alltagscode ist, der halt gelegentlich tut, dann schreib das if(condition) genau an die Stelle, wo Du unterscheiden willst. Einfach machen und Häkchen dran, nicht lang grübeln. Und geh da erst wieder ran, wenn im Profiler auftaucht, dass Du da 5% Gesamtzeit verbringst.

Wenn das irgendne kritische Innere Schleife ist, ne Bildbearbeitung oder so, wo diese Schleife wirklich oft läuft, dann solltest Du Dir vorab genau die Gedanken machen, die Du hier gemacht hast. Wie Krishty schon schrieb: dieses if() wird von der Sprungvorhersage wahrscheinlich gut antizipiert werden. Du musst da also echt millionenfach durch, bevor Du die Kosten davon wirklich merkst. Und dann gibt's verschiedene Methoden:

a) zwei Funktionen. Ganz plump eine für den Fall ohne Extralogik schreiben, und eine für den Fall mit Extralogik. Dann, wenn Dir das zuviel Copy&Paste ist, gemeinsamen Code in kleine Helferfunktionen rausziehen. Optimizer wird das inlinen, wenn Du ihm die Gelegenheit gibst, und fertig.

b) if() rausziehen, zwei Schleifen schreiben. Wie oben, nur halt lokal in einer Funktion.

b) C++-Templates. Die Lösung mag ich:

Code: Alles auswählen

template <bool doExtra> void DoTheThing() {
  for( int a = 0; a < HUGENUMBER; ++a) {
    if constexpr (doExtra) 
      doTheExtraThing();
  }
}
Nur als Beispiel. Das wird zur Compile-Time aufgelöst und ist so optimal, wie's wird. In jedem Fall: wenn es schnell ausgeführt werden soll, pack es so lokal wie möglich. In C++ würd ich darüber einen anonymen Namespace aufmachen, so dass das Zeug wirklich nur in dieser Übersetzungseinheit sichtbar ist, und dann kann der Compiler mit ner Menge Selbstvertrauen in dem Code wüten und Sachen rausholen.

Deine Assembly-Geschichte - ich versteh's nicht. Feste Sprünge gehen auch in C/C++, niemand verbietet Dir das goto. Nur läuft es logisch dann halt auf die Version mit den zwei Schleifen hinaus, Assembler hat da genau 0 Vorteile gegenüber der Hochsprache. Oder ich seh's nicht.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Krishty »

Schrompf hat geschrieben: 14.11.2024, 22:51Deine Assembly-Geschichte - ich versteh's nicht. Feste Sprünge gehen auch in C/C++, niemand verbietet Dir das goto. Nur läuft es logisch dann halt auf die Version mit den zwei Schleifen hinaus, Assembler hat da genau 0 Vorteile gegenüber der Hochsprache. Oder ich seh's nicht.
Das nennt sich Computed Goto und wird in C/C++ nicht unterstützt. Anstatt an eine statische Adresse zu springen, springst du zum Ergebnis einer Berechnung. So wie du einen Zeiger auf Daten in C/C++ dereferenzieren kannst, kannst du einen Zeiger auf Code in Assembler anspringen. Du entscheidest einmal vor dem for die Adresse im Schleifenrumpf, an der deine Verzweigung beginnt, gemäß der Bedingung. Du speicherst die in der Variable, und nutzt für den Rücksprung am Ende der Schleife die Adresse in der Variable. Ist sehr schnell und kompakt.

Deinen Template-Vorschlag nutze ich so, um in zeitkritischen Funktionen Debugging an- und auszuschalten, und kann es nur weiterempfehlen. Aber die Frage ist eher philosophisch angehaucht, wie Alexander ausführt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von TomasRiker »

GCC ermöglicht Computed Goto via "Labels as Values". Siehe: https://gcc.gnu.org/onlinedocs/gcc/Labe ... alues.html

Achtung bei C++: Destruktoren werden ggf. nicht aufgerufen.
Benutzeravatar
Schrompf
Moderator
Beiträge: 5040
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Schrompf »

Ah, wieder was gelernt, Danke! Aber ehrlich: das mag zwar existieren, aber man sollte auf diesem Level nur noch diskutieren dürfen, wenn man nen Flamegraph ausgedruckt mitbringt, auf dem die problematische Funktion als Saurons Turm auftaucht.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Alexander Kornrumpf
Moderator
Beiträge: 2138
Registriert: 25.02.2009, 13:37

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Alexander Kornrumpf »

Das geht jetzt sehr stark auf Laufzeitoptimierung, und wie ich starcow kenne ging es ihm vor allem darum, aber ich möchte doch nochmal für das Protokoll anbringen, dass der vermeintlich "duplizierte" Code entgegen einem verbreiteten Irrglauben aus den 80ern lesbarer ist, weil der Mensch einfach bauartbedingt sehr schlecht darin ist über 5 function calls hinweg 27 ifs im Kopf zu verwalten, aber erstaulich gut darin ist, die Welt in eine Reihe von High-Level Fällen aufzuteilen.

Das alleine ist vielleicht nicht so die Bahnbrechende Erkenntnis, aber, wie der oben verlinkte Artikel erklärt und ich aus der Praxis vollständig bestätigen kann: Entgegen der Intuition ist der "duplizierende" Code oft sogar kürzer als der "wiederverwendbare" weil das was man eigentlich machen will oft tatsächlich ziemlich simpel wäre wenn man nicht 35 Abstraktionslayer darüber hätte.
NytroX
Establishment
Beiträge: 387
Registriert: 03.10.2003, 12:47

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von NytroX »

Für dein Problem gibt es einen extra-Schritt in jedem Compiler/Optimizer.
Schreib einfach den Code wie in deinem ersten Beispiel, das hat keine Nachteile zur Laufzeit (until proven otherwise) - du musst deinen Code nicht manuell "verunstalten" :-)
Irgendwie fasziniert mich das Problem, weil ich bislang dachte, dass es keine Situation gäbe, in dem Assembly Code "strukturell" C Code überlegen sein kann.
Ist er nicht. Optimal ist der Code so, wie du ihn im ersten Beispiel schreibst, weil du ihn dann noch verstehst und weil er für dich logisch ist.
Gotos und Aufteilen in mehrere Schleifen ist keine Optimierung am Code, sondern höchstens eine Optimierung der Laufzeit. Und das kann jeder einigermaßen moderne Compiler auch ohne dich - genau genommen macht der Compiler mit deinem Code genau das, was du im 2. Beispiel schreibst ;-)

Siehe auch: https://en.wikipedia.org/wiki/Loop_optimization (insbesondere: Loop-invariant code motion)

Es kann natürlich sein, dass der Compiler das manchmal nicht hinbekommt, wenn der Code ausreichend komplex ist.
Dann sollte man aber:
1. Messen - ist das Verhalten wirklich ein Problem? Macht es Sinn, hier was zu optimieren / ist es ein Bottleneck? (siehe: https://en.wikipedia.org/wiki/Amdahl%27s_law)
2. Optimierungsversuch - jetzt mal anders implementieren (z.B. dein 2. Beispiel)
3. Nochmal messen. Ist es wirklich besser geworden? Ist die manuelle Änderung besser als der Optimizer, und schneller als der Branch Predictor der CPU? (Der dürfte im Beispiel eine Treffer-Wahrscheinlichkeit von fast 100% haben). Ist der Performance zuwachs im (vermutlich ein Micro-) Benchmark auch wirklich statistisch signifikant? (siehe: https://de.wikipedia.org/wiki/Statistische_Signifikanz)
4. Wenn nein, goto 2) else fertig.
Benutzeravatar
Lord Delvin
Establishment
Beiträge: 597
Registriert: 05.07.2003, 11:17

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Lord Delvin »

Ich würde mal ausprobieren Block A und Block B in eine Funktion auszulagern, die Bedingung selbst zu hoisten und zu schauen, was der Compiler draus macht. Da kann relativ guter Code rauskommen.
Krishty hat geschrieben: 14.11.2024, 22:59 Das nennt sich Computed Goto und wird in C/C++ nicht unterstützt. Anstatt an eine statische Adresse zu springen, springst du zum Ergebnis einer Berechnung. So wie du einen Zeiger auf Daten in C/C++ dereferenzieren kannst, kannst du einen Zeiger auf Code in Assembler anspringen. Du entscheidest einmal vor dem for die Adresse im Schleifenrumpf, an der deine Verzweigung beginnt, gemäß der Bedingung. Du speicherst die in der Variable, und nutzt für den Rücksprung am Ende der Schleife die Adresse in der Variable. Ist sehr schnell und kompakt.
Gotos mit variablen Sprungzielen sind für Analyse und Optimierung ziemlich vernichtend; würde erwarten, dass die allermeisten Entwickler damit nur Schaden anrichten würden. IIRC, wird das im Tyr Backend nur für einen obskuren Randfall verwendet; kann mich an keinen anderen Fall in meiner Karriere erinnern wo ich es angemessen fände.
XML/JSON/EMF in schnell: OGSS
Keine Lust mehr auf C++? Versuche Tyr: Get & Get started
Benutzeravatar
Schrompf
Moderator
Beiträge: 5040
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas
Wohnort: Dresden
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Schrompf »

Och, ich bin alt genug, ich habe noch selbstmodifizierenden Code geschrieben. Aber das waren andere Zeiten. Heutzutage tja... ist ja schon alles gesagt worden.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
starcow
Establishment
Beiträge: 560
Registriert: 23.04.2003, 17:42
Echter Name: Mischa Schaub
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von starcow »

Wahnsinn, ihr seid wirklich ne heftige Liga - herzlichen Dank!
Krishty hat geschrieben: 14.11.2024, 22:59 Das nennt sich Computed Goto und wird in C/C++ nicht unterstützt. Anstatt an eine statische Adresse zu springen, springst du zum Ergebnis einer Berechnung. So wie du einen Zeiger auf Daten in C/C++ dereferenzieren kannst, kannst du einen Zeiger auf Code in Assembler anspringen. Du entscheidest einmal vor dem for die Adresse im Schleifenrumpf, an der deine Verzweigung beginnt, gemäß der Bedingung. Du speicherst die in der Variable, und nutzt für den Rücksprung am Ende der Schleife die Adresse in der Variable. Ist sehr schnell und kompakt.
Schön formuliert und auf den Punkt gebracht. Es ist das, was ich meinte.
TomasRiker hat geschrieben: 14.11.2024, 23:09 GCC ermöglicht Computed Goto via "Labels as Values". Siehe: https://gcc.gnu.org/onlinedocs/gcc/Labe ... alues.html
Achtung bei C++: Destruktoren werden ggf. nicht aufgerufen.
Ich bin überrascht. Damit hätte ich jetzt nicht gerechnet! Gut zu wissen!
Schrompf hat geschrieben: 14.11.2024, 23:29 ... auf dem die problematische Funktion als Saurons Turm auftaucht.
Ich liebe diese "schrompfschen" Formulierungen einfach! ^^
Freelancer 3D- und 2D-Grafik
mischaschaub.com
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Krishty »

starcow hat geschrieben: 17.11.2024, 18:15
TomasRiker hat geschrieben: 14.11.2024, 23:09 GCC ermöglicht Computed Goto via "Labels as Values". Siehe: https://gcc.gnu.org/onlinedocs/gcc/Labe ... alues.html
Achtung bei C++: Destruktoren werden ggf. nicht aufgerufen.
Ich bin überrascht. Damit hätte ich jetzt nicht gerechnet! Gut zu wissen!
Das ist enorm wichtig bei interpretierten Sprachen, insbesondere in Schleifen. Anstatt jeden Befehl einzeln zu lesen und in einem switch auszuwerten, konvertiert man die Befehle einmalig zu Sprungadressen und macht nur noch goto. Irgendeine Skriptsprache wurde dadurch mal 30 % schneller. Die Lesbarkeit kann man sich vorstellen und die Portierbarkeit ist Null, aber die Leistungsverbesserung ist echt handfest.

Dein Beispiel ist nur nicht der beste Anwendungsfall, wie die anderen schon angemerkt haben.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von TomasRiker »

Krishty hat geschrieben: 17.11.2024, 20:39 Anstatt jeden Befehl einzeln zu lesen und in einem switch auszuwerten, konvertiert man die Befehle einmalig zu Sprungadressen und macht nur noch goto. Irgendeine Skriptsprache wurde dadurch mal 30 % schneller. Die Lesbarkeit kann man sich vorstellen und die Portierbarkeit ist Null, aber die Leistungsverbesserung ist echt handfest.
Würde ein "schlauer" Compiler ein geeignetes switch-Konstrukt nicht mithilfe einer Jump Table umsetzen? Wenn man dann noch einen default-Fall mit unreachable hinzufügt, sollte der Maschinencode identisch zur Version mit Computed Goto sein, oder? (Da der Compiler annehmen darf, dass alle Werte behandelt werden, und sich darum eine zusätzliche Prüfung auf den Wertebereich sparen kann.)
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Krishty »

TomasRiker hat geschrieben: 17.11.2024, 21:21
Krishty hat geschrieben: 17.11.2024, 20:39 Anstatt jeden Befehl einzeln zu lesen und in einem switch auszuwerten, konvertiert man die Befehle einmalig zu Sprungadressen und macht nur noch goto. Irgendeine Skriptsprache wurde dadurch mal 30 % schneller. Die Lesbarkeit kann man sich vorstellen und die Portierbarkeit ist Null, aber die Leistungsverbesserung ist echt handfest.
Würde ein "schlauer" Compiler ein geeignetes switch-Konstrukt nicht mithilfe einer Jump Table umsetzen? Wenn man dann noch einen default-Fall mit unreachable hinzufügt, sollte der Maschinencode identisch zur Version mit Computed Goto sein, oder? (Da der Compiler annehmen darf, dass alle Werte behandelt werden, und sich darum eine zusätzliche Prüfung auf den Wertebereich sparen kann.)
Du hättest dann noch immer eine Indirektion mehr (und eine Datenabhängigkeit dazu) – denn du musst den Befehl benutzen, um in der Sprungtabelle nachzuschlagen.

goto *jumpTable[opcode_id];

anstelle von

goto *opcode_label;
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
TomasRiker
Beiträge: 96
Registriert: 18.07.2011, 11:45
Echter Name: David Scherfgen
Wohnort: Hildesheim

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von TomasRiker »

Ah, jetzt hat's Klick gemacht. 👍
Ja, das ist wirklich clever. Ähnliches ginge auch mit Funktionszeigern, aber sicherlich deutlich ineffizienter wegen des Overheads von Funktionsaufrufen ...
Benutzeravatar
Krishty
Establishment
Beiträge: 8316
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: Dilemma: Code duplizieren oder if statement in loop

Beitrag von Krishty »

Ja, ganz richtig. Der Vergleich ist aber gut, denn das gleiche Problem hat man beim Aufruf virtueller Funktionen vs. Funktionszeiger: Eine Indirektion und Datenabhängigkeit mehr, und in inneren Schleifen spürt man die.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten