Codeoptimierung bei Methoden in Classen

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Codeoptimierung bei Methoden in Classen

Beitrag von Mathias »

Ich habe da ein Minimal-Programm, dieses braucht 367'485 Byte.

Code: Alles auswählen

program project1;
begin
end


Füge ich eine Classe hinzu, welche aber nie gebraucht wird, wird da Programm 378'069 Byte .

Code: Alles auswählen

program project1;
type
  TTest = class(TObject)
  end;
begin
end

Wieso wird das zweite Programm grösser ?
Ich dachte immer der Compiler optimiert solche Sachen.
Sowieso, über 300 KByte für ein Programm, das nichts macht, ist recht gross. :shock:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Codeoptimierung bei Methoden in Classen

Beitrag von theo »

Na und? Speicherst du auf Floppy Disk? :mrgreen:
Passt ja sogar da noch drauf.

http://wiki.freepascal.org/Size_Matters/de

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Codeoptimierung bei Methoden in Classen

Beitrag von wp_xyz »

Mathias hat geschrieben:Sowieso, über 300 KByte für ein Programm, das nichts macht, ist recht gross. :shock:

Da hast du wohl die Infobox beim Installieren von Lazarus nicht gelesen: http://wiki.freepascal.org/Lazarus_Faq/ ... o.C3.9F.3F

mischi
Beiträge: 206
Registriert: Di 10. Nov 2009, 18:49
OS, Lazarus, FPC: macOS, 10.13, lazarus 1.8.x, fpc 3.0.x
CPU-Target: 32Bit/64bit

Re: Codeoptimierung bei Methoden in Classen

Beitrag von mischi »

Whole program optimization (wpo) könnte da noch helfen und strip. Dass das aber alles weg macht, glaub ich nicht.
MiSchi macht die fink-Pakete

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Codeoptimierung bei Methoden in Classen

Beitrag von mse »

Oder MSElang:

Code: Alles auswählen

 
program test;
type
 ttest = class
  public
   field: int32;
   constructor create();
   destructor destroy();
 end;
 
{ ttest }
 
constructor ttest.create();
begin
 field:= 123;
end;
 
destructor ttest.destroy();
begin
end;
 
var
 t1: ttest;
begin
 t1:= ttest.create();
 writeln(t1.field);
 t1.destroy();
end.
 

Code: Alles auswählen

 
mse@linuxmse:~/packs/standard/git/mselang/mselang> ./test.bin
123
mse@linuxmse:~/packs/standard/git/mselang/mselang> ls -l -h test1.bin
-rwxr-xr-x 1 mse users 16K Nov 28 09:38 test1.bin
 

16K ist AFAIK die minimale Grösse einer Programmdatei auf Linux. Edit: Unsinn, siehe unten.
Zuletzt geändert von mse am Sa 9. Jan 2016, 12:50, insgesamt 1-mal geändert.

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Codeoptimierung bei Methoden in Classen

Beitrag von Mathias »

@mse

In deinem Beispiel wird die Klasse TTest verwendet, ab bei mir ist nur eine Deklaration vorhanden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Codeoptimierung bei Methoden in Classen

Beitrag von wp_xyz »

Mathias, deiner Signatur entnehme ich, dass du noch Lazarus 0.9 und fpc2.2 verwendest. Ich habe deine beiden Mini-Programme aus dem 1. Post nun mit fpc3.0.0 (mit Lazarus trunk) übersetzt:

1. Projekt - 68 kB mit Debuginfo, 31 kB ohne Debuginfo (d.h. kein Häkchen vor "Debugger" / "Debuginformationen für GDB erzeugen"
2. Projekt - 71 kB mit, 31 kB ohne Debuginfo.

Etwa dieselben Ergebnisse sehe ich mit fpc 2.6.4 (und Laz 1.4.4).

Zwischen 2.2 und 2.6.4 scheint sich einiges getan zu haben. Ein Wink, vielleicht mal eine neuere Version zu versuchen?

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Codeoptimierung bei Methoden in Classen

Beitrag von Mathias »

Mathias, deiner Signatur entnehme ich, dass du noch Lazarus 0.9 und fpc2.2 verwendest.

Ups, die muss ich mal anpassen, ich verwende auch das neuste Gespann, erst gestern erneuert.

Ich habe mein erstes Beispiel nochmals probiert, dabei habe ich alle Haken bei Debugging entfernt.
Optimierungen auf Stufe 3.
Der Unterschied mit und ohne Deklaration besteht immer noch.

mit 179'664
ohne 179'424

Verwende Linux 64Bit.
Hast du Windows verwendet ?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4889
Registriert: Fr 8. Apr 2011, 09:01

Re: Codeoptimierung bei Methoden in Classen

Beitrag von wp_xyz »

Mathias hat geschrieben:Verwende Linux 64Bit.
Hast du Windows verwendet ?

Ach so, ja, Windows 7. Unter Linux Mint-32bit, FPC 2.6.4, werden's 130 kB (232 mit Debuginfo).

Mathias
Beiträge: 6194
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Codeoptimierung bei Methoden in Classen

Beitrag von Mathias »

Noch ein Nachtrag.
Wen ich das Leere Programm mit fpc project1.lpr übersetze, wird das Ergebniss noch etwas kleiner. Mit Deklaration, kann ich so nicht kompilieren.

Verwende ich anstelle von class object, dann wird das leere object weg optimiert.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Codeoptimierung bei Methoden in Classen

Beitrag von mse »

Mathias hat geschrieben:In deinem Beispiel wird die Klasse TTest verwendet, ab bei mir ist nur eine Deklaration vorhanden.

Und trotzdem erzeugt MSElang lediglich 16K.
Ohne Verwendung der Klasse bleibt es bei 16K. So viel ich weiss ist 16K die minimale Grösse für Linux Programm-Dateien.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Codeoptimierung bei Methoden in Classen

Beitrag von mse »

mse hat geschrieben:So viel ich weiss ist 16K die minimale Grösse für Linux Programm-Dateien.

Das ist Quatsch.

Ich habe noch utf8string hinzugenommen:

Code: Alles auswählen

 
program test;
type
 ttest = class
  public
   field: string8;
   constructor create();
   destructor destroy();
 end;
 
{ ttest }
 
constructor ttest.create();
begin
 field:= 'abc';
end;
 
destructor ttest.destroy();
begin
end;
 
var
 t1: ttest;
begin
 t1:= ttest.create();
 writeln(t1.field);
 t1.destroy();
end.
 

Code: Alles auswählen

 
mse@linuxmse:~/packs/standard/git/mselang/mselang> ./test.bin
abc
mse@linuxmse:~/packs/standard/git/mselang/mselang> filesize test.bin
11516
mse@linuxmse:~/packs/standard/git/mselang/mselang> strip -s test.bin
mse@linuxmse:~/packs/standard/git/mselang/mselang> filesize test.bin
5696
 

-> nach strip bleiben noch 5'696 Bytes. Noch kleiner wird jetzt glaube ich schwierig...

Antworten