AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Compileroptimierung: Was passiert?

Ein Thema von yankee · begonnen am 28. Okt 2005 · letzter Beitrag vom 28. Okt 2005
Antwort Antwort
Benutzerbild von yankee
yankee

Registriert seit: 10. Mär 2004
1.134 Beiträge
 
Lazarus
 
#1

Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 05:53
Als ich mit c++ angefangen habe, hatte ich in meinen Tutorials immer auch gleich Hinweise, wie die Compileroptimierung funzt. Also mit C++ bin ich noch ganz am Anfang und weiß kaum was darüber, aber bei Delphi weiß ich garnichts darüber.

Ich habe zum Beispiel hier gelesen, dass man result in Funktionen besser nicht benutzen sollte. Also ist die C++-Lösung (mit return) dann doch eigentlich besser. Zumindest zum Verständnis. Wenn es Delphi aber schon mit result macht, dann würde ich denken, dass die Compileroptimierung darauf eingestellt ist, dass man result auch richtig benutzt.

Naja, irgendwie versuche ich beim Programmieren schon öfters mal darüber nach, was die Compileroptimierung mit meinem Code so macht. Also ist es jetzt egal, ob man inc(a) oder a :=a +1 benutzt? Wie sieht es mit inline-Funktionen aus? So "richtig" gibt es die ja in Delphi nicht, aber eigentlich habe ich bis jetzt schon angenimmen, das die Compileroptimierung sehr kurze Funktionen dann doch als inline compiliert. Was ist, wenn ich mit div statt mit / dividiere? Ich könnte ja auch trunc oder round benutzen, um wieder einen integer zu bekommen. Macht da die Compileroptimierung was mit? Wie sieht es mit solchen Aufrufen aus:
Delphi-Quellcode:
type TZeug= record;
var1: integer;
var2: string;
end;
var bla: array of TZeug;
setlength(bla, length(bla) +1);
bla[length(bla) -1].var1 :=1;
bla[length(bla) -1].var2 :='bla';
macht die compileroptimierung draus was besseres oder berechnet der dann length(bla) wirklich 3 mal?

Was ist mit Konstanten? Geht der Compiler da einfach von oben nach unter durch und ersetzt alle constanten durch ihre Werte, oder gibt es da was tiefsinnigeres?
Was ist eigenlich mit Pointern? Also ist es besser zu versuchen in einem array den key zu meiden und stattdessen einen Pointer auf das arrayitem zu verwenden oder ist das garnicht schneller? (Also besonders wenn man einen array aus records hat und die Element bezug aufeinander haben. Soll man da einen Pointer nehmen, oder lieber den key als integer im record speichern? Grundätzlich ist der key ja praktischer, weil man dann auch in dem array das vorhergende Element oder sowas rankommt. Wenn Pionter wirklich schnelle sind: Darf man dafür hinnehmen, das gewisse Sachen iterativ nicht mehr lösbar sind? (Also beispielsweise einen Stammbaum, wo es immer Mutter und Vater gibt. Dort muss man dann schließlich rekursiv jeden der Beiden Zweige durchgehen, wenn man eine Aktion mit allen Elementen durchführen will, und alles nur mit New() und Dispose() statt mit array gelöst ist. Achja, wenn man einen array iteriert (bei PHP gibt es ja foreach dafür), also mit for i:=0 to count(array)-1 do, erkennt der compiler das und macht da irgendwas besseres draus?
mit while(i<100) do inc(i); ist soviel langsamer als die Version mit for. Was macht der Compiler mit for soviel anders?

Also wirklich sehr viele Fragen zur Codeoptimierung und Compileroptimierung. Ich fände es mal äußerst interessant zu wissen, wie der Compiler da vorgeht. Und vielleicht ein Vergeleich zu andern Compilern? Haben die C++-Compiler wirklich eine besser Optimierung? Wie sieht das eigentlich mit PHP aus? Da sind die Möglichkeiten ja sehr eingeschränkt bis nicht vorhanden. Was macht der Interpreter da?
Letzter Tipp: Drogen. Machen zwar nicht glücklich, geben einem aber wenigstens das Gefühl glücklich zu sein.

Have a lot of fun!
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 07:23
Kann jetzt nicht alles im Detail beantworten. Aber ein paar Sachen schon.

inc(i) ist besser als i:=i+1. Da bei dem zweiten Konstrukt quasi eine temporäre Variable erzeugt wird und bei inc direkt der speicherbereich der Variablen um 1 erhöht wird.

Das mit result resultiert glaube daraus, dass diese immer im einem Register abgelegt wird. Bedeutet also, wenn du direkt in der ersten Zeile der Funktion result:=1 schreibst, dann wird das register bis zum Prozedur ende belegt und steht für Schleifen nicht mehr zur Verfügung.

Bei div und / liegt der unterschied in den Assembler Anweisungen. Bei / wird die FPU genutzt (muss ja) und diese ist langsamer als die Integer-Division.

Sicherlich sind Pointer auf einen Array-Eintrag besser. Aber in einer Konstruktion wie

Delphi-Quellcode:
for i:=0 to 10 do
  Arr[i]:=10;
erzeugt Delphi automatisch einen Pointer und zählt diesen immer hoch bzw. runter. Bei schleifen wird nämlich immer versucht eine Prüfung gen 0 zu erreichen, da diese schneller ist als die Prüfung gegen 10.

Naja erstmal ein paar Sachen für den Anfang
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
teebee

Registriert seit: 17. Jan 2003
Ort: Köln
460 Beiträge
 
Delphi 6 Professional
 
#3

Re: Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 08:38
Zitat von jim_raynor:
inc(i) ist besser als i:=i+1. Da bei dem zweiten Konstrukt quasi eine temporäre Variable erzeugt wird und bei inc direkt der speicherbereich der Variablen um 1 erhöht wird.
Aus 'inc(i,x);' und 'i := i+x;' macht Delphi den selben Maschinencode.
Gruß, teebee
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 08:39
Also "Inc(I)" und "I := I + 1;" werden vom Compiler zu ein und demselben Code verarbeitet.

Seit Delphi 7 laeuft eine for-Schleife abwaerts sofern es die Statements im Block der Schleife erlauben.
for- und while-Schleife sind nur in C synonym. In Pascal wird die obere Grenze nur einmal ausgewertet.
Zusaetzlich ist die Schleifenvariable insofern priviligiert als es nicht garantiert ist das nach Ablauf der Schleife der Wert garantiert ist (siehe obige Richtungsoptimierung).
Vermutlich optimiert der Compiler eine leere for-Schleife komplett weg.

Bei Konstanten muss man typisierte und untypisierte Konstanten unterscheiden.
Typisierte Konstanten werden durch Variablen implementiert. Bei untypisierte Konstanten setzt der Compiler den Wert direkt in den generierten Code.
Eine textuelle Ersetzung ist nur beim C Präprozessor vorhanden, der eine eigene Sprache bildet.
  Mit Zitat antworten Zitat
schöni

Registriert seit: 23. Jan 2005
Ort: Dresden
445 Beiträge
 
Delphi 7 Personal
 
#5

Re: Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 09:47
Hallo yankee!

Mit Deinen Überlegungen bringst Du mich auf die Idee, den Quellcode für eine Aufgabenstellung in verschiedenen Versionen zu schreiben, das Ganze dann mit vollständiger Debuginfo zu übersetzen und dann nicht nur auf Quelltextebene, sondern auch mit Hilfe des CPU-Fensters zu analysieren, das es seit Delphi 4 gibt. Dann sihst Du am besten, was der Compiler aus dem Code macht. Mit Laufzeitmessungen kannst Du auch noch die Performance messen. Da habe ich aber die aufzurufenden Prozeduren jtzt nicht im Kopf:

Auf jeden Fall:

Zeitmessung starten

Die eigene Prozedur aufrufen

Zeitmessung stoppen

Ergenis anzeigen

schöni
Damit der Topf nicht explodiert, lässt man es ab und zu mal zischen.
  Mit Zitat antworten Zitat
DerDan

Registriert seit: 15. Nov 2004
Ort: Donaueschingen
251 Beiträge
 
Delphi XE3 Professional
 
#6

Re: Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 11:37
Zitat von schöni:
Hallo yankee!

Mit Deinen Überlegungen bringst Du mich auf die Idee, den Quellcode für eine Aufgabenstellung in verschiedenen Versionen zu schreiben, das Ganze dann mit vollständiger Debuginfo zu übersetzen und dann nicht nur auf Quelltextebene, sondern auch mit Hilfe des CPU-Fensters zu analysieren, das es seit Delphi 4 gibt. Dann sihst Du am besten, was der Compiler aus dem Code macht. Mit Laufzeitmessungen kannst Du auch noch die Performance messen. Da habe ich aber die aufzurufenden Prozeduren jtzt nicht im Kopf:

Auf jeden Fall:

Zeitmessung starten

Die eigene Prozedur aufrufen

Zeitmessung stoppen

Ergenis anzeigen

schöni
Aus anderen Compilern ist mir bekannt, das mit vollständigem Debug, manche Optimierungen abgeschaltet werden. Ist bei Delphi wahrscheinlich auch so! Das sollt man dan schon mal berücksichtigen!


mfg DerDan
nichts ist so schön wie man es sich vorstellt
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#7

Re: Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 11:42
Zitat von DerDan:
Aus anderen Compilern ist mir bekannt, das mit vollständigem Debug, manche Optimierungen abgeschaltet werden. Ist bei Delphi wahrscheinlich auch so! Das sollt man dan schon mal berücksichtigen!
mfg DerDan
Ist mir nicht bekannt.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
LarsMiddendorf

Registriert seit: 4. Sep 2003
Ort: Hemer
104 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Compileroptimierung: Was passiert?

  Alt 28. Okt 2005, 11:43
Zitat:
Wie sieht es mit inline-Funktionen aus? So "richtig" gibt es die ja in Delphi nicht, aber eigentlich habe ich bis jetzt schon angenimmen, das die Compileroptimierung sehr kurze Funktionen dann doch als inline compiliert.
Ab Delphi2005 gibt es inline Funktionen. Allerdings mit einigen Einschränkungen so dass nicht alle Funktionen geinlined werden.
Bei Delphi.Net werden automatisch alle Funktionen die nicht länger als 32 Befehle sind und keine Schleifen,case of oder Exception Blöcke enthalten geinlined.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz