da ist die erste Variante in der Regel besser als die erste
Jo...
Aber es stimmt schon: In Hochsprachen zu optimieren ist grober Käse, da kommst du nicht weit. Ein neues Javaupdate, ein anderer Compiler - und schon verhält sich dein Programm wieder etwas anders bezüglich der Laufzeit und Speicherverhalten. Und dann kommt noch dazu, daß in Java ja noch zur Laufzeit etwas umherkompiliert wird. Das genaue Laufzeitverhalten ist da praktisch unvorhersehbar, wenn man nicht gerade direkt an der JMV-Entwicklung beteiligt ist (und womöglich selbst dann nicht einmal).
Bei hardwarenahen Sprachen wie C wird das zwar oft gemacht, aber da hat man eigentlich genau dieselben Probleme: Anderer Compiler, andere Optimierungsoptionen - und schon läuft das Programm etwas anders als gewollt/gedacht.
Daher: Wenn man ernsthaft Ressourcen optimieren will/muß, macht man das in Assembler - oder gar nicht. Hochsprachen sind mal dafür entwickelt worden, um von der konkreten Maschine zu abstrahieren, und daher ist es schon rein vom Ansatz her völlig unsinnig, in Hochsprachen irgendwas optimieren zu wollen. Und wenn du dich in diese Gegend einarbeiten willst würde ich dir raten, tatsächlich mal ASM zu programmieren. Kleine 8-Bit-Mikrocontroller oder so etwas...da lernt man sehr viel und man sieht dann auch, wieviele Möglichkeiten man auf der Maschine hat, einen Haufen Anweisungen abzuarbeiten. Ich greife dein Beispiel mal auf:
Danke für die sehr vollständigen Antworten.
Zusatz-(und letzte) Frage zum Thema Speicher:
Beide folgende Varianten funktionnieren. Ich habe aber das Gefühl, die erste Variante ist speichertechnisch verschwenderisch. Stimmt das so ? Sprichst sonst etwas für die eine oder für die andere Variante.
while (...) {
double zwischenResultat = ...;
...
}
double zwischenResultat;
while (...) {
zwischenResultat = ...;
...
}
Es ist keineswegs gesagt, daß der Computer diese Schleife tatsächlich als Schleife ausführt. 'Schleife' heißt, am Ende einen Rücksprung zum Startpunkt der Schleife zu haben - und Sprungbefehle kosten Rechenzeit. Einmal zum Zurückspringen, und dann zum Prüfen der Abbruchbedingung der Schleife.
Jetzt gibt es aber nichts, was den Compiler z.B. daran hindert, die Anweisungen in der Schleife einfach dreimal hintereinander zu kopieren - ohne Sprungbefehle. Wenn der Speicher egal ist, aber ein paar Takte gespart werden können - warum nicht?
Nicht selten weiß man als Programmierer ja auch nicht, wie oft die Schleife ausgeführt wird. Aber die JVM hat vielleicht schon eine Ahnung, und macht zur Laufzeit, was sie gerade für richtig hält - je nach JVM-Implementierung, Rechner, Mondphase und ob die JVM um Mitternacht von 12 Jungfrauen kompiliert wurde oder nicht.
Es wäre auch durchaus denkbar, daß deine Variable 'zwischenResultat' nur in einem Rechenregister existiert. Da muß sie sowieso rein, um eben darauf zu rechnen. Dann würde dafür aber überhaupt kein Speicher alloziiert werden, und jede Diskussion über den Speicherbedarf wäre völlig gegenstandslos.
Aber das sind alles Dinge, die weißt du zur Programmierzeit einfach nicht. Sie sind sogar so gebaut, daß du sie nicht wissen mußt. Also vertrau den Machern der JVM und dem ganzen Drumherum - einerseits sind das kluge Leute, andererseits hast du sowieso keine andere Wahl (sofern du nicht JVM-Assembler lernen willst).