Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Datenstruktur: Kindobjekt als Objekt oder Record (https://www.delphipraxis.net/210506-datenstruktur-kindobjekt-als-objekt-oder-record.html)

Friday 4. Mai 2022 15:43

AW: Datenstruktur: Kindobjekt als Objekt oder Record
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1505424)
Ich stehe auf dem Schlauch - Inwiefern ist das ein Problem?

Der auf dem Schlauch steht bin wohl ich selbst :roll:
Hatte das mehrfach gelesen, aber immer falsch verstanden. Records können natürlich keine Interfaces implementieren im Sinne von
Delphi-Quellcode:
MyRec = Record(IMyInterface)
Aber sehr wohl interfaces als Felder oder properties haben.

OK...also nochmal weniger das gegen Records spricht.

Aber wie seht ihr das Argument den Stack nicht unnötig mit langlebigen Daten zu befüllen? (Die noch dazu keinen Geschwindigkeitsvorteil benötigen weil selten kopiert)

Der schöne Günther 4. Mai 2022 15:48

AW: Datenstruktur: Kindobjekt als Objekt oder Record
 
Auf einem PC (im Gegensatz zu einem kleinen Mikrocontroller) muss man echt schon einiges anstellen um den Stack voll zu bekommen. Standardmäßig ist die Stack-Größe (pro Thread) in Delphi bei 1 Megabyte (lässt sich einstellen).

Ich bin kein Compiler/Assemblercode-Experte, aber ich würde dem Compiler durchaus zutrauen dass er die Register bzw. den Memory für den Stack wiederverwendet und bei z.B. 5 dicken Records nicht fünf mal allokiert. Und: Wenn man die Daten als
Delphi-Quellcode:
const
oder
Delphi-Quellcode:
[Ref]
übergibt, dann optimiert der Compiler das dorthin gehend, dass die Daten nur per Zeiger übergeben werden.

mytbo 4. Mai 2022 16:36

AW: Datenstruktur: Kindobjekt als Objekt oder Record
 
Zitat:

Zitat von Friday (Beitrag 1505428)
Aber wie seht ihr das Argument den Stack nicht unnötig mit langlebigen Daten zu befüllen?

Ich weiß nicht, warum du dir Sorgen um den Stack machst. So wie ich deine Anforderung verstanden habe, wird es vermutlich mit einem "array of ..." enden und damit landest du auf dem Heap. Auf dem Heap werden angelegt: Klassen, dynamische Arrays, alle gemanagten Typen (String, Variant, Interface) und Speicher der mit GetMem() oder New() angefordert wird. Daher funktioniert auch Folgendes problemlos:
Delphi-Quellcode:
uses
  mormot.core.base,
  mormot.core.data,
  mormot.core.text,
  mormot.core.json,
  mormot.core.unicode,
  mormot.core.variants,
  mormot.core.os,
  mormot.core.perf;

procedure SpeedTestRecords;
type
  TSubItem = record
    id: Integer;
    value: RawUtf8;
  end;
  TDataItem = record
    id: Integer;
    value: RawUtf8;
    subItem: TSubItem;
  end;
  TDataItems = array of TDataItem;
var
  json, xml: RawByteString;
  timer: TPrecisionTimer;
  items: TDataItems;
begin
  SetLength(items, 1000000);
  for var i: Integer := Low(items) to High(items) do
  begin
    items[i].id := i;
    items[i].value := StringToUtf8('value' + i.ToString);
    items[i].subItem.id := i;
    items[i].subItem.value := StringToUtf8('subItem_value' + i.ToString);
  end;

  timer.Start;
  json := DynArraySaveJson(items, TypeInfo(TDataItems));
  timer.Pause;
  FileFromString(json, '_testData.json');

  timer.Resume;
  xml := JsonToXML(json);
  timer.Pause;
  FileFromString(xml, '_testData.xml');

  WriteLn(Format('Total time: %s', [timer.Stop]));
end;
Habe ich schon erwähnt, dass mORMot diese 1M Records JSON und XML Serialisierung in 1 Sekunde schafft.

Bis bald...
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr.
Seite 2 von 2     12   

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