![]() |
TJSONToObject Performance
Hi,
Ich habe ein kleines Problem mit der Performance von TJSONtoObject. JSON ist grob so aufgebaut.
Code:
Ich bekomme eine Server Response. Im Array sind ca. 65.000 Objekte. Nutze ich JSONToObject um das JSON in eine Klasse zu pumpen und dann darauf zuzugreifen, dauert das ca. 15,7 Sekunden.
{
"objects": [ { "value1": "value", "value2": "value", "value3": "value", "value4": "value", "value5": "value", "value6": "value", "value7": "value", "value8": "value", "value9": "value" }, { "value1": "value", "value2": "value", "value3": "value", "value4": "value", "value5": "value", "value6": "value", "value7": "value", "value8": "value", "value9": "value" } ] } Wenn ich über das JSONObject selbst außeinander nehme, dauert es 2,8 Sekunden. Auf dem PC, auf dem mobilen Endgerät ist dann beides nochmal um den Faktor 4 langsamer (Wahrscheinlich geräteabhängig). Nur mit 10 Sekunden kann man halt leben, mit 1 Minute wirds dann schon langsam nervig. Ich würde ungern das JSON händisch durchgehen, habt ihr eine Idee oder einen Tipp wie man noch ein bisschen Performance aus dem JSONToObject rausholen könnte? LG PJM |
AW: TJSONToObject Performance
Wie sieht denn deine Klasse aus?
Und irgendwie müsstest du die Länge / Kapazität des Arrays vorher passend setzen, damit es nicht ständig vergrößert werden muss. |
AW: TJSONToObject Performance
Moin Olli,
die Klasse sieht so aus:
Delphi-Quellcode:
type
TArrayClass<T: Class> = class private fObjects: TArray<T>; public property Objects: TArray<T> read fObjects write fObjects; end; TBaseClass = class private fValue1: string; fValue2: string; fValue3: string; fValue4: string; fValue5: string; public property Value1: string read fValue1 write fValue1; property Value2: string read fValue2 write fValue2; property Value3: string read fValue3 write fValue3; property Value4: string read fValue4 write fValue4; property Value5: string read fValue5 write fValue5; end; TExtenderClass = class(TBaseClass) private fValue6: string; fValue7: string; fValue8: string; fValue9: string; public property Value6: string read fValue6 write fValue6; property Value7: string read fValue7 write fValue7; property Value8: string read fValue8 write fValue8; property Value9: string read fValue9 write fValue9; end; TCompleteList = class(TArrayClass<TExtenderClass>); .... var lList: TCompleteList; ... lList:= TJson.JsonToObject<TCompleteList>(MyJSONString); ... |
AW: TJSONToObject Performance
Zitat:
|
AW: TJSONToObject Performance
Ich kenn das nur so:
Delphi-Quellcode:
Macht DAS einen Unterschied?
TCompleteList = class
FObjects: TArray<TExtenderClass>; end; |
AW: TJSONToObject Performance
Zitat:
|
AW: TJSONToObject Performance
Bei Performanceproblemen gibt es viele mögliche Ursachen. Könntest du einen konkreten Testfall mit dem entsprechenden JSON erstellen mit dem wir das nachstellen können?
|
AW: TJSONToObject Performance
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
Hier wird der Unterschied sogar noch viel deutlicher. |
AW: TJSONToObject Performance
Es ist wohl richtig, dass eine direkte Verarbeitung des JSONObject schneller ist als das RTTI-basierte JsonToObject. Selbst bei der Umwandlung der einzelnen Values weißt du ja schon, dass es sich um Strings handelt und kannst das durch den gezielten Aufruf von TryGetValue<string> ausnutzen, während andernfalls immer der Umweg über TValue erfolgen muss.
Also, ja, direkt das JSON abzuarbeiten ist deutlich performanter - aber eben auch aufwändiger und schlechter wartbar. Du musst halt abwägen. |
AW: TJSONToObject Performance
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:34 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