![]() |
AW: Datenstruktur: Kindobjekt als Objekt oder Record
Zitat:
Hatte das mehrfach gelesen, aber immer falsch verstanden. Records können natürlich keine Interfaces implementieren im Sinne von
Delphi-Quellcode:
Aber sehr wohl interfaces als Felder oder properties haben.
MyRec = Record(IMyInterface)
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) |
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:
oder
const
Delphi-Quellcode:
übergibt, dann optimiert der Compiler das dorthin gehend, dass die Daten nur per Zeiger übergeben werden.
[Ref]
|
AW: Datenstruktur: Kindobjekt als Objekt oder Record
Zitat:
Delphi-Quellcode:
Habe ich schon erwähnt, dass mORMot diese 1M Records JSON und XML Serialisierung in 1 Sekunde schafft.
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; Bis bald... Thomas |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:45 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 by Thomas Breitkreuz