Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi kleines Programm - riesiger Prozess (https://www.delphipraxis.net/28529-kleines-programm-riesiger-prozess.html)

sieppl 25. Aug 2004 22:32


kleines Programm - riesiger Prozess
 
Hallo,

mich interessiert warum, meine kompilierte exe 95kb groß ist und der
dazugehörge Prozess zur Laufzeit über 2200kb. mir ist schon klar,
dass einige Dinge erst zur Laufzeit geladen werden, aber wie bekomme
ich heraus, welche Teile des Programms später am meisten Speicher verbrauchen
und wie ich das Problem in den Griff kriege?
2200kb für eine Überwachung von WM_DEVICEChange mit ein paar extras kann
doch nicht soviel Platz in Anspruch nehmen oder? :gruebel:
Falls ihr mehr Infos über mein Programm braucht, bitte kurzes Reply.

Grüße

Sebastian

Luckie 25. Aug 2004 22:37

Re: kleines Programm - riesiger Prozess
 
Die Größe der Exe hat nichts mit der Größe zu tun, die deine Anwendung an Speicher reserviert. Arrays, Objekte, (globale) variablen, alles belegt Speicher. Das werden die 2200 KB sein.

sieppl 25. Aug 2004 22:58

Re: kleines Programm - riesiger Prozess
 
Zitat:

Die Größe der Exe hat nichts mit der Größe zu tun, die deine Anwendung an Speicher reserviert. Arrays, Objekte, (globale) variablen, alles belegt Speicher. Das werden die 2200 KB sein.
das war mir vorher in etwa auch schon klar. Ich habe meine Frage wohl schlecht formuliert.

Ich möchte ein wenig genauer wissen, wie sich die grüße des prozesses zusammensetzt. Es muss doch Erfahrungswerte (gerade bei den alten Delphi-Hasen) geben, so dass man sagen kann welche Programmteile den Prozess groß machen und welche nicht.

dizzy 25. Aug 2004 23:08

Re: kleines Programm - riesiger Prozess
 
Eine Variable:
Delphi-Quellcode:
var DickesDingen: array[Cardinal] of Byte;
belegt höllisch viel RAM,
Delphi-Quellcode:
var KleinesTeil: Byte;
kaum etwas.

Sämtliche Datenstrukturen die du verwendest brauchen so viel Speicher, wie sie eben brauchen. Mit Delphi-Referenz durchsuchenSizeOf hannst du herausbekommen wie viele Bytes eine Variable belegt.

gruss,
dizzy

Luckie 25. Aug 2004 23:08

Re: kleines Programm - riesiger Prozess
 
Was dein Programm groß macht, habe ich doch oben schon genannt.

nailor 25. Aug 2004 23:13

Re: kleines Programm - riesiger Prozess
 
die vcl!!!

bei mir hat ne leere vcl-anwendung 2220 kb. bei nonvcl ist es weniger (ich glaube 700 + x). an sonsten hängt es im wesentlichen von den eingebundenen units ein, weil du schon sehr viel eigenen code tippen musst, bis das den speicher aufbläht (höchstens du reservierst irgendwo exzessiv puffer). bilder und so sind natürlich auch platzfresser.

Luckie 25. Aug 2004 23:16

Re: kleines Programm - riesiger Prozess
 
Bei einem 95 KB großen Programm ist es sehr unwahtrscheinlich, dass er die VCL benutzt. Was es aufbläht, im Speicher, sind die verwendeten Datenstrukturen.

nailor 25. Aug 2004 23:18

Re: kleines Programm - riesiger Prozess
 
Zitat:

Zitat von dizzy
Eine Variable:
Delphi-Quellcode:
var DickesDingen: array[Cardinal] of Byte;

Code:
[Fehler] Unit1.pas(20): Datentyp zu groß: 2 GB überschritten
:mrgreen:

dizzy 25. Aug 2004 23:47

Re: kleines Programm - riesiger Prozess
 
Zitat:

Zitat von nailor
Zitat:

Zitat von dizzy
Eine Variable:
Delphi-Quellcode:
var DickesDingen: array[Cardinal] of Byte;

Code:
[Fehler] Unit1.pas(20): Datentyp zu groß: 2 GB überschritten
:mrgreen:

*gnarf* Hab ich mir doch gedacht... dann halt "Cardinal div 2". Das sollte so gerade noch gehen ;)

NicoDE 25. Aug 2004 23:59

Re: kleines Programm - riesiger Prozess
 
Zitat:

Zitat von dizzy
dann halt "Cardinal div 2". Das sollte so gerade noch gehen ;)

Nö :)
Delphi-Quellcode:
type
  PDickesDingen = ^TDickesDingen;
  TDickesDingen = array[0..High(Integer) - 1] of Byte;

dizzy 26. Aug 2004 00:49

Re: kleines Programm - riesiger Prozess
 
Ey das eine Byte... :D

Dann halt (Cardinal div 2)-1 :drunken:

nailor 26. Aug 2004 01:18

Re: kleines Programm - riesiger Prozess
 
Liste der Anhänge anzeigen (Anzahl: 1)
das klappt auch nicht. siehe screenshot!

lass ich alles in der funktion weg, und deklarier nur den typ, dann gehts wiederum.

edit: kann das an 512 MB RAM + 7XX MB Pagefile liegen, dass das deshalb nichts wird? aber warum krepiert der dann, bevor er es probiert (keine festplattenzugriffe --> keine pagefile)

Luckie 26. Aug 2004 01:24

Re: kleines Programm - riesiger Prozess
 
So:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  PDickesDingen = ^TDickesDingen;
  TDickesDingen = array[0..High(Integer) - 1] of Byte;
var
  Foo: PDickesDingen;
begin
  new(Foo);
end;
Bekomme ich eine OutOfMemory Exception.

nailor 26. Aug 2004 01:27

Re: kleines Programm - riesiger Prozess
 
so klappts bei mir auch (mit der "korrekten" exception) aber wieder bevor er überhaupt versucht hat, die pagefile vollzukleistern

NicoDE 26. Aug 2004 02:27

Re: kleines Programm - riesiger Prozess
 
Zitat:

Zitat von nailor
das klappt auch nicht. siehe screenshot!

Ich gehe mal davon aus, dass Du weder die Größe des Stacks angepasst hat, noch das System mit /3GB gestartet hast, noch im PE-Header das Flag gesetzt hast, das die Anwendung mit mehr als 2GB zurechtkommt... (und selbst dann ist es unwahrscheinlich dass das System solch einen grossen Stack allozieren kann/will).

Solche Arrays definiert man normalerweise nur als Hilfstypen, um ohne Auslösen der Überlauf/Bereichsprüfung auf Arrays unbekannter Länge zuzugreifen.

dizzy 26. Aug 2004 02:54

Re: kleines Programm - riesiger Prozess
 
Okay, jetzt wirds interessant.
Folgendes kompiliert bei mir noch so gerade eben - ein Element mehr, und das Teil bringt eine AV:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  TDickesDingen = array[0..$FC5AF] of Byte;
var
  Foo: TDickesDingen;
  i: Integer;
begin
  for i := 0 to Length(Foo)-1 do
    Foo[i] := 0;
end;
Das macht 1.033.648 Elemente á 1 Byte, also ziemlich genau 1 Megabyte.
Der Stack ist auf Max. 1.048.576 Byte. Na, was fällt auf? ;)
Ohne Zugriff, also die bloße Deklaration klappt bis 2Gig!

Dann dieses:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  PDickesDingen = ^TDickesDingen;
  TDickesDingen = array[0..$40F2FFF7] of Byte;
var
  Foo: PDickesDingen;
begin
  new(Foo);
end;
Wird auch gerade noch korrekt ausgeführt.

Kombiniert man dies, kann man mit der Schleife tatsächlich durch das Array im 2. Code durchlaufen, da hier ganz offensichtlich nicht der Stack bemüht wird:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
type
  PDickesDingen = ^TDickesDingen;
  TDickesDingen = array[0..$40F2FFF7] of Byte;
var
  Foo: PDickesDingen;
  i: Integer;
begin
  new(Foo);
  for i := 0 to Length(Foo^)-1 do
    Foo^[i] := 0;
end;
Aaaaber: 0..$40F2FFF7 = 1.089.667.064 Byte und das sind 1,015 Gigabyte => Ich habe 1 Gig RAM. Aber das Teil verbrauchte zur Laufzeit nur kurzzeitig > 700MB, und dann rutschte es gewaltig auf ~20 bis 50MB runter, mitten in der Schleife. :gruebel:
(Messung per Taskmanager :roll:)

Es müsste ja theoretisch noch ein Gig mehr gehen... Haut aber partout nicht hin, obwohl mein Pagefile auf 4Gig steht.
Auch mit einer 2. Variable dieses Typs und mit new erzeugt führt zu einer "Out of Memory".

Wenn ich mich recht erinnere, dann hatte ich schon mal ein 3-dimensionales statisches Array verwendet, bei dem mir die 2 Gig-Grenze begenete, und ich hatte es dann auf "knapp darunter" verkleinert, und auch damit gearbeitet. Allerdings als globale Variable, und somit ja nicht auf dem Stack, und auch nicht als Pointer mit new, sondern direkt - aber wieso ging das hier jetzt nicht? :gruebel:
(Kann aber auch sein, dass ich mich irre - ist schon etwas her)

Darf also ein Prozess die Größe des vorhadenen RAMs nicht überschreiten, so dass immer die gesamte Prozess rein passt? Dann werden auch immer nur ganze Prozesse ausgelagert?? Wäre doch birnig, oder?

Ich schnall's glaub ich nicht :stupid: und geh mal besser ins Bett...

sieppl 26. Aug 2004 09:34

Re: kleines Programm - riesiger Prozess
 
okay, danke erstmal.
Ich werde mal meine deklarationen zusammenrechnen und zusätzlich mal schauen, ob meine Typauswahl immer die treffendste war. Dankeschön!

Vjay 26. Aug 2004 12:02

Re: kleines Programm - riesiger Prozess
 
Im Taskmanager werden soweit ich weiss auch verwendete DLLs mit angerechnet user32.dll z.B.

Da diese aber eh schon geladen sind, müsstest du dir die allocierten bereiche des Speichers mal genau anschauen und diese Dinge abziehen.

Kann dieses Norton Systeminfo z.B.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz