C++ statische membervariable lesen oder wert berechnen. was ist schneller?

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
328
für welche operationen ist es schneller, den vorher berechneten wert aus einer statischen klassenvariable zu lesen, anstatt den wert neu zu berechnen?

hintergrund der frage: ich erzeuge millionen instanzen einer klasse und rufe dann eine funktion der klasse auf. dort wird ein wert berechnet und weiter verarbeitet. dieser wert ändert sich während des programablaufs nicht. ( er hängt von startparametern a und b ab). zb
wert1 = (a+10)/11 + 5
oder
wert2 = ((b- a%4)/3) % 7

wäre es schneller, wert1 und/oder wert2 einmalig beim programmstart zu berechnen und in einer privaten statischen klassenvariable zu speichern und von dort in den funktionsaufrufen zu lesen?
 
Der Wert muss man ja irgendwann berechnet werden. Entweder wenn die Instanz der Klasse erzeugt wird oder später wenn darauf zugegriffen wird.
Im 1. Fall belegt der Wert natürlich zusätzlichen Speicher aber wenn du später den Wert (eventuell sogar mehrmals) ausliest, sparst du dir dann natürlich die Zeit die du vorher beim erstellen der Instanz geopfert hast. Es wird zwar keinen großen Unterschied machen, aber wenn du dir überlegst wie eine CPU arbeitet (mit Registern), wirst du feststellen, dass es natürlich "länger" dauert einen Wert zu berechnen als einen aus dem Speicher zu laden (ich gehe davon aus, dass a auch erst geladen werden muss).

Du musst du dir dein Szenario nun halt überlegen. Wie oft greifst du auf den Wert zu? Hast du genug Arbeitsspeicher zur Verfügung? Muss die Ausführung oder die Startzeit extrem kurz sein? usw.
 
Da kann man ehrlich gesagt nur mutmaßen (ich schätze mal, das chachen des Werts wäre schneller). Eine eindeutige Antwort wirst du (zumindest für deinen Fall) nur durch Profiling erhalten.
 
striker159 schrieb:
wäre es schneller, wert1 und/oder wert2 einmalig beim programmstart zu berechnen und in einer privaten statischen klassenvariable zu speichern und von dort in den funktionsaufrufen zu lesen?

Verstehe ich nicht.

Eine statische Klassenvariable wird nur einmal berechnet und steht dann in der Klasseninstanz zur Verfügung. Was willst Du denn dann später daran "berechnen"? Was meinst Du mit "Funktionsaufrufen"? Du kannst den Wert gar nicht nochmal berechnen, weil er als statische Klassenvariable schon berechnet wurde.
 
blöderidiot schrieb:
Verstehe ich nicht.

Eine statische Klassenvariable wird nur einmal berechnet und steht dann in der Klasseninstanz zur Verfügung. Was willst Du denn dann später daran "berechnen"? Was meinst Du mit "Funktionsaufrufen"? Du kannst den Wert gar nicht nochmal berechnen, weil er als statische Klassenvariable schon berechnet wurde.

Stimme dir zwar prinzipiell zu, aber du kannst den Wert einer statischen Membervariable sehr wohl später noch mal ändern (auch wenn es hier keinen Sinn macht, da es gerade eben vermieden werden soll, den Wert mehrmals zu berechnen). Warum sollte das nicht gehen?
 
antred schrieb:
Warum sollte das nicht gehen?

Geht schon, sofern nicht "constant", aber in dieser Situation ist es doch so, dass eine Klasseninstanz einen Wert braucht, der sich nach dem Programmstart nicht mehr ändert und der dann laut TE "über eine Funktion" zugewiesen oder berechnet werden soll.

Das ist jedoch ganz und gar unnötig, da ja der Wert der statischen Klassenvariablen der Instanz sowieso schon zur Verfügung steht. Der Wert ist also einfach schon da, wenn die Instanz erzeugt wird.
 
da hast du mich falsch verstanden. der wert wird momentan in der funktion berechnet und dann weiterverarbeitet. die überlegung ist, diese berechnung einmal beim programmstart durchzuführen und zwischenzuspeichern. und jede instanz liest dann aus dieser statischen variable anstatt zu berechnen.

statische variable deshalb, da die funktion nur einmal pro instanz aufgerufen wird.

als code:
so ist es momentan
1mrd mal
Code:
class::function(){
 wert = "wert berechnung";
 "mach was mit wert"
}

optimierungsüberlegung
Code:
1 mal 
static class::init() { berechne wert }

1mrd mal
class::function(){
 wert = statische variable
 "mach was mit wert"
}
 
Zuletzt bearbeitet:
Spontan geraten würde ich sagen, dass das (natürlich je nach Komplexität der Berechnung) wohl schneller sein dürfte; statische Variablen liegen üblicherweise im Daten-Segment deines Prozesses, dürften also mit einem LOAD-Befehl verfügbar sein. Für die Berechnung brauchst Du wohl mehr Zyklen.

Ansonsten würde ich Dir aber raten, zunächst mal das Programm auf die "logische" Art zu schreiben und dann an Engpässen zu optimieren.
"We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil." (Knuth, Donald. Structured Programming with go to Statements, ACM Journal Computing Surveys, Vol 6, No. 4, Dec. 1974. p.268.)
 
Zurück
Oben