AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Mein Programm ist Arbeitsspeicher hungrig..
Thema durchsuchen
Ansicht
Themen-Optionen

Mein Programm ist Arbeitsspeicher hungrig..

Ein Thema von Cubysoft · begonnen am 18. Mai 2015 · letzter Beitrag vom 20. Mai 2015
Antwort Antwort
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 04:38
Hallo,
ich würde noch packend Record schreiben.

Für Speicherlecks werfe ich noch FastMM4 rein..


Heiko
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#2

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 07:40
Packed wird hier nichts ändern und bei aktiv genutzten Records im Speicher ist wowas es etwas ungünstiger.

Vorner der 4 Byte Pointer und dahinter eine gute Anzahl an Bytes, womit am Ende alles praktisch schon gepackt ist, da keine Leerstellen entstehen
und es sind sogar so viele Bytes (Boolean), daß der Record voll ist. (vielfaches von 4)

Und dann ist das Array mit den Records eh nichtmal 2 MB groß.
Wie hier welche entdeckt haben, liegt das Problem ja ganz wo anders. (Speicherlecks)
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 10:36
Packed wird hier nichts ändern und bei aktiv genutzten Records im Speicher ist wowas es etwas ungünstiger.

Vorner der 4 Byte Pointer und dahinter eine gute Anzahl an Bytes, womit am Ende alles praktisch schon gepackt ist, da keine Leerstellen entstehen
und es sind sogar so viele Bytes (Boolean), daß der Record voll ist. (vielfaches von 4)

Und dann ist das Array mit den Records eh nichtmal 2 MB groß.
Wie hier welche entdeckt haben, liegt das Problem ja ganz wo anders. (Speicherlecks)
Nööö jedes Byte wird aligned daher
{$A1}

Und NATÜRLICH keinen Logstring nehmen.... Wie oft steht da der gleiche String drin?

Geändert von Mavarik (19. Mai 2015 um 12:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#4

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 11:50
Bytes sind nie Aligned, bzw. immer an 1 ausgerichtet, egal ob mit oder ohne Packed.

{$ALIGN} gibt nur die maximale Ausrichtung an und kleineren Typen werden immer an ihrer eigenen Größe ausgerichtet.

Zitat:
Wire oft steht da der gleiche String drin?
Ist egal, solange die Strings nicht aus der selben Quelle kommen (Kopie des selben Strings), belegt jeder leider seinen eigenen Speicher.
Die Strings werden alle "neu" erzeugt (teilweise aus einem Anderen rauskopiert) und sind demnach immer unique. (gibt standardmäßig "leider" keinen Algo, der das zusammenfasst)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (19. Mai 2015 um 11:54 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 12:21
Die Strings werden alle "neu" erzeugt (teilweise aus einem Anderen rauskopiert) und sind demnach immer unique. (gibt standardmäßig "leider" keinen Algo, der das zusammenfasst)
Und? Chars in einer großen Liste speichern und nur den Pointer auf den Start... Test ob Kombination schon existent und gleichen pointer zurück geben...
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 12:25
Bytes sind nie Aligned, bzw. immer an 1 ausgerichtet, egal ob mit oder ohne Packed.
Schon aber

Delphi-Quellcode:
type
  A = packed Record // Sizeof = 5
        S : String;
        B1 : byte;
      End;
  B = Record // Sizeof = 8
        S : String;
        B1 : byte;
      End;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.399 Beiträge
 
Delphi 12 Athens
 
#7

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 12:45
Ja, aber in seinem Record gibt es "zufällig" genau ein Vielfaches von 4, an Bytes/Booleans.

Und wie gesagt, die Liste mit allen Records selber ist grade mal 0,7 MB groß winzig.
Wobei die gesamten 100 MB nun eigentlich auch nicht wirklich soooooo viel sind.


PS: In XE8 hat man ja grade noch den "Spaß", daß generische Listen mit SizeOf(T) > 4 kaputt sind.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.157 Beiträge
 
Delphi 10.3 Rio
 
#8

AW: Mein Programm ist Arbeitsspeicher hungrig..

  Alt 19. Mai 2015, 13:06
PS: In XE8 hat man ja grade noch den "Spaß", daß generische Listen mit SizeOf(T) > 4 kaputt sind.
emm wie? Unter welchen Bedingungen?
  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 14:12 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