kostenanalyse - was ist billiger, if anweisung oder zuweisung?
-
hi leute
ich habe eine schleife, die mehrere millionen mal durchlaufen werden kann,
abhängig von der größe der datei.
abhängig von einer bedingung soll nun ein wert aus den bytes der datei berechnet
werden.
ich könnte den wert aber auch gleich, unabhängig von der bedingung berechnen und erst am ende des lesevorgangs die bedingung prüfen.pseudo code 1:
var byte = 0 var wert = 0 - schleife bis datei-ende: byte = lese_byte_aus_datei + analyse ( byte ) if ( bedingung ist wahr ) wert = wert + byte - ende der schleife if ( bedingung ist wahr ) verarbeite wert
pseudo code 2:
var byte = 0 var wert = 0 - schleife bis datei-ende: byte = lese_byte_aus_datei + analyse ( byte ) wert = wert + byte - ende der schleife if ( bedingung ist wahr ) verarbeite wert
was ist billiger?
-
probiers aus
-
Eine komplexe Fragestellung, bei der sehr viele Faktoren eine Rolle spielen (unter anderem auch der genaue Prozessortyp!) und du zeigst bloß Pseudocode. Doch selbst mit konkretem Code hat mein Vorredner recht: Ausprobieren und Vergleichen FTW!
Falls ich mit den bisherigen Informationen eine Wette abschließen sollte, würde ich auf die if-Variante als Sieger setzen.
-
In einem Fall wird der Wert unter einer Bedingung addiert und im anderen Fall ohne Bedingung. Sieht mir nach unterschiedlichen Code aus.
Ansonsten: Trust your Compiler. Das sind solche Sachen, die der Compiler problemlos optimieren kann. Formuliere es so, wie es richtig ist und der Compiler macht das Beste daraus. Was das Beste ist, hängt von ganz vielen Faktoren ab, wie beispielsweise verwendete CPU bis hinab zur Größe des Caches.
Außerdem: Wenn Du die Daten aus der Datei liest, ist die Prüfung oder Zuweisung wahrscheinlich vernachlässigbar.
Und Gedanken, um die Geschwindigkeit von Zuweisungen gehören in die Welt der Mikrooptimierung, die bei 99,341% der Fälle nichts bringt.
-
nachdem es hier um eine reine bauchschätzung gehen soll, tippe ich auf zweiteres, ohne es zu messen.
und der grund für meinen tipp ist, dass der schleifenkörper kleiner ist und keinen sprungbefehl enhält.
ich warte auf ein ausgemessenes ergebnis
-
tntnet schrieb:
Ansonsten: Trust your Compiler. Das sind solche Sachen, die der Compiler problemlos optimieren kann.
Niemals kann ein Compiler die erste Variante zur zweiten optimieren oder umgekehrt.
-
SeppJ schrieb:
tntnet schrieb:
Ansonsten: Trust your Compiler. Das sind solche Sachen, die der Compiler problemlos optimieren kann.
Niemals kann ein Compiler die erste Variante zur zweiten optimieren oder umgekehrt.
Theoretisch ginge das unter bestimmten Bedingungen schon.
Wenn die Adresse von "wert" nur lokal bekannt ist, und sichergestellt ist dass die Bedingung innerhalb der Schleife und bis zum "verarbeite wert" immer den selben Wert hat, dann wäre es dem Compiler mMn. erlaubt die Transformation vorzunehmen.
Es ändert sich ja nichts am beobachtbaren Verhalten des Programms, und wenn die Adresse von "wert" nur lokal bekannt ist kann es auch zu keinem Data Race kommen.Wobei ich nicht sagen will dass ich glaube dass aktuelle Compiler schlau genug sind das zu machen.