Zitat von
SMO:
Zitat von
dizzy:
Mh, find ich nun fast enttäuschend. Dann heisst Inlining dort tatsächlich nur Ersparnis des Calls, bzw. der Vorbereitung der Parameter, und den Optimizer kümmerts nicht?
Nein. Jetzt zum dritten Mal:
Ein "var" Parameter
erzwingt eine Speichervariable. Da ist dann nichts mehr drin mit Registeroptimierung und so. Wenn man also solche Tests macht, dann bitte den einzelnen Testfällen (hier der Prozedur und der Funktion) jeweils ihre
eigenen lokalen Variablen geben.
Um die Variable im Speicher/Register ging es hier garnicht. Es ging um das doppelt ausgeführte xor zum Erzeugen einer Null.
Zitat von
SMO:
Delphi-Quellcode:
var
i: Integer;
begin
x(i);
i := y;
end.
So kann es ja nichts mit der Optimierung werden. Denn erstens ist i hier keine lokale Variable (wird also so oder so auf eine Speicherzelle abgebildet) und zweitens wird i für x und y benutzt, wobei x verhindert, das i auf ein Register statt Speicherzelle abgebildet wird.
Ist wie gesagt garnicht Gegenstand der Diskussion
Zitat von
SMO:
So ist es besser:
Delphi-Quellcode:
procedure Test;
var
ergx, ergy: Integer;
begin
x(ergx);
ergy := y;
end;
Mit inlining wird "ergy := y" hier total wegoptimiert.
Das wäre dann aber grober Unfug, es sei denn D2005 tut auf einmal etwas ganz neues: Lokale Variablen mit 0 (nil) initialisieren. Ist dem so? Warum erkennt der Optimizer dann nicht auch, dass in der Prozedur x nur eine Null zugewiesen wird, und optimiert auch diesen Aufruf weg? Sowas meinte ich mit inkonsequent.
Zitat von
tommie-lie:
Ist es sicherlich, aber es muss implementiert werden. Und da die Compilerautoren davon ausgehen, daß die Leute richtige Programme damit schreiben, sparen sie sich solche Prüfungen, weil nur in Spezialfällen davon ausgegangen werden kann, daß wirklich immer das selbe getan wird.
Wenn ich mich recht entsinne werden Ausdrücke wie "x := sqrt(2)*10;" vom Compiler ausgerechnet und als Konstante implementiert (weiss nicht mehr ob das bei Delphi oder C# der Fall war). Hier könnte man auch argumentieren: Warum rechnet es der Autor nicht selber aus? Kommentieren soll man bei "richtigen" Programmen eh, also kann da auch der Rechenweg dokumentiert sein wenn es um die Lesbarkeit geht =)
Und ich meine es wäre auch (MS)C# gewesen der eine Schleife in der immer nur ein konstanter Wert auf eine Variable addiert wird, im Vorhinein komplett ausrechnet und nur mit einer Konstanten ohne Schleife implementiert. Ein "Optimizer" der nur greift wenn ich eh schon recht optimal gecoded habe, ist
imho ebenfalls inkonsequent
. Zumal die Beispiele hier für den Coder offensichtliche Optimierungsmöglichkeiten zeigen. In dem obigen Beispiel geht es eher um die Ebene die der Programmierer erst im
asm-code sehen könnte, und somit nichtmal direkten Einfluss darauf hat. Sicher sind die Methoden da oben sehr panne, da sie nur eine 0 schreiben. Aber es geht doch um das Konzept! Wenn so etwas einfaches nicht erkannt/verbessert wird, wie kann ich mich da noch darauf verlassen dass es in komplexeren Zusammenhängen besser läuft?
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel