Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi REST.Json extrem langsam? (https://www.delphipraxis.net/214435-rest-json-extrem-langsam.html)

seb83 10. Jan 2024 13:58

REST.Json extrem langsam?
 
Hi,

deserialisiere ein Objekt mit einer Liste mit 500 Objekten, dies dauert 5-7 Sekunden, ist das normal? Gibt es schnellere JSON Serialisierer?

Stevie 10. Jan 2024 14:44

AW: REST.Json extrem langsam?
 
Zitat:

Zitat von seb83 (Beitrag 1531746)
Gibt es schnellere JSON Serialisierer?

Ja

mytbo 10. Jan 2024 15:02

AW: REST.Json extrem langsam?
 
Wenn es auf Geschwindigkeit ankommt, nimm mORMot. Benchmark-Werte siehe Artikel hier im Forum.

Bis bald...
Thomas

seb83 10. Jan 2024 16:28

AW: REST.Json extrem langsam?
 
Zitat:

Zitat von mytbo (Beitrag 1531754)
Wenn es auf Geschwindigkeit ankommt, nimm mORMot. Benchmark-Werte siehe Artikel hier im Forum.

Bis bald...
Thomas

Mal umgebaut und auch extrem langsam >5s irgendwo muss da ein Problem drin stecken, obwohl das Objekt und alles vollkommen einfach sind.

Uwe Raabe 10. Jan 2024 16:30

AW: REST.Json extrem langsam?
 
Dann solltest du mal etwas Code zeigen - idealerweise ein kleines Programm, mit dem man es reproduzieren kann.

seb83 10. Jan 2024 16:32

AW: REST.Json extrem langsam?
 
Programm ist schwierig und JSON auch, da ich das nicht öffentlich machen kann.
Das Objekt.
Code:
type
  TecRmiData = class
  private
    FTypeId: string;
    FTcdTypeId: string;
    FHerstSchluessel: string;
    FTypSchluessel: string;
    FVvs_Schluessel: string;
    FTypVvsPruefziffer: string;
    FFahrzeugklasse: string;
    FCodeAufbau: string;
    FFabrikMarke: string;
    FAmtlKlartextTyp: string;
    FVariante: string;
    FVersion: string;
    FHandelsName: string;
    FHerstText: string;
    FAmtlKlartextaufbau: string;
    FTxtKraftstoffKurz: string;
    FCodeKraftstoff: string;
    FHubraum: string;
    FAnzAchsen: string;
    FAbgasrichtlTg: string;
    FNationaleEmiklasse: string;
    FAntriebsachs: string;
    FNennleistungKw4: string;
    FNennleistungElektro30Min: string;
    FHoechstgeschwindigkeit: string;
    FAnzahlSitze: string;
    FMasseFahrbereitMin: string;
    FMasseFahrbereitMax: string;
    FTechZulGesamtMasse: string;
    FZulMaxAchsLast1: string;
    FZulMaxAchsLast2: string;
    FCo2Kombi: string;
    FStandgeraeusch3: string;
    FDrehStandgeraeusch: string;
    FFahrgeraeusch3: string;
    FTechnZulAnhaengerLastGebrem: string;
    FTechnZulAnhaengerLastUngebrem: string;
    FLeistungsGew: string;
    FLaengeMin: string;
    FLaengeMax: string;
    FBreiteMin: string;
    FBreiteMax: string;
    FHoeheMin: string;
    FHoeheMax: string;
    FStuetzLast: string;
    FBereifAchse1: string;
    FBereifAchse2: string;
    FGenehmigungsNr01: string;
    FGenehmigungsDat01: string;
    FBemerkungenAusnahmen: string;
    FAnmerkungen: string;
    FTxAnbringFzidnr: string;
    FBaumuster: string;
    FTxGetrTyp: string;
    FFelgeAchse1: string;
    FFelgeAchse2: string;
  published
    property TypeId: string read FTypeId write FTypeId;
    property TcdTypeId: string read FTcdTypeId write FTcdTypeId;
    property HerstSchluessel: string read FHerstSchluessel
      write FHerstSchluessel;
    property TypSchluessel: string read FTypSchluessel write FTypSchluessel;
    property Vvs_Schluessel: string read FVvs_Schluessel write FVvs_Schluessel;
    property TypVvsPruefziffer: string read FTypVvsPruefziffer
      write FTypVvsPruefziffer;
    property Fahrzeugklasse: string read FFahrzeugklasse write FFahrzeugklasse;
    property CodeAufbau: string read FCodeAufbau write FCodeAufbau;
    property FabrikMarke: string read FFabrikMarke write FFabrikMarke;
    property AmtlKlartextTyp: string read FAmtlKlartextTyp
      write FAmtlKlartextTyp;
    property Variante: string read FVariante write FVariante;
    property Version: string read FVersion write FVersion;
    property HandelsName: string read FHandelsName write FHandelsName;
    property HerstText: string read FHerstText write FHerstText;
    property AmtlKlartextaufbau: string read FAmtlKlartextaufbau
      write FAmtlKlartextaufbau;
    property TxtKraftstoffKurz: string read FTxtKraftstoffKurz
      write FTxtKraftstoffKurz;
    property CodeKraftstoff: string read FCodeKraftstoff write FCodeKraftstoff;
    property Hubraum: string read FHubraum write FHubraum;
    property AnzAchsen: string read FAnzAchsen write FAnzAchsen;
    property AbgasrichtlTg: string read FAbgasrichtlTg write FAbgasrichtlTg;
    property NationaleEmiklasse: string read FNationaleEmiklasse
      write FNationaleEmiklasse;
    property Antriebsachs: string read FAntriebsachs write FAntriebsachs;
    property NennleistungKw4: string read FNennleistungKw4
      write FNennleistungKw4;
    property NennleistungElektro30Min: string read FNennleistungElektro30Min
      write FNennleistungElektro30Min;
    property Hoechstgeschwindigkeit: string read FHoechstgeschwindigkeit
      write FHoechstgeschwindigkeit;
    property AnzahlSitze: string read FAnzahlSitze write FAnzahlSitze;
    property MasseFahrbereitMin: string read FMasseFahrbereitMin
      write FMasseFahrbereitMin;
    property MasseFahrbereitMax: string read FMasseFahrbereitMax
      write FMasseFahrbereitMax;
    property TechZulGesamtMasse: string read FTechZulGesamtMasse
      write FTechZulGesamtMasse;
    property ZulMaxAchsLast1: string read FZulMaxAchsLast1
      write FZulMaxAchsLast1;
    property ZulMaxAchsLast2: string read FZulMaxAchsLast2
      write FZulMaxAchsLast2;
    property Co2Kombi: string read FCo2Kombi write FCo2Kombi;
    property Standgeraeusch3: string read FStandgeraeusch3
      write FStandgeraeusch3;
    property DrehStandgeraeusch: string read FDrehStandgeraeusch
      write FDrehStandgeraeusch;
    property Fahrgeraeusch3: string read FFahrgeraeusch3 write FFahrgeraeusch3;
    property TechnZulAnhaengerLastGebrem: string
      read FTechnZulAnhaengerLastGebrem write FTechnZulAnhaengerLastGebrem;
    property TechnZulAnhaengerLastUngebrem: string
      read FTechnZulAnhaengerLastUngebrem write FTechnZulAnhaengerLastUngebrem;
    property LeistungsGew: string read FLeistungsGew write FLeistungsGew;
    property LaengeMin: string read FLaengeMin write FLaengeMin;
    property LaengeMax: string read FLaengeMax write FLaengeMax;
    property BreiteMin: string read FBreiteMin write FBreiteMin;
    property BreiteMax: string read FBreiteMax write FBreiteMax;
    property HoeheMin: string read FHoeheMin write FHoeheMin;
    property HoeheMax: string read FHoeheMax write FHoeheMax;
    property StuetzLast: string read FStuetzLast write FStuetzLast;
    property BereifAchse1: string read FBereifAchse1 write FBereifAchse1;
    property BereifAchse2: string read FBereifAchse2 write FBereifAchse2;
    property GenehmigungsNr01: string read FGenehmigungsNr01
      write FGenehmigungsNr01;
    property GenehmigungsDat01: string read FGenehmigungsDat01
      write FGenehmigungsDat01;
    property BemerkungenAusnahmen: string read FBemerkungenAusnahmen
      write FBemerkungenAusnahmen;
    property Anmerkungen: string read FAnmerkungen write FAnmerkungen;
    property TxAnbringFzidnr: string read FTxAnbringFzidnr
      write FTxAnbringFzidnr;
    property Baumuster: string read FBaumuster write FBaumuster;
    property TxGetrTyp: string read FTxGetrTyp write FTxGetrTyp;
    property FelgeAchse1: string read FFelgeAchse1 write FFelgeAchse1;
    property FelgeAchse2: string read FFelgeAchse2 write FFelgeAchse2;
  end;

type
  TKbaDataResult = class(TObject)
  private
    FSearchKey: string;
    FTooMuchResults: Boolean;
    FNumberOfResults: Integer;
    FNumberOfPossibleResults: Integer;
    FFoundData: TArray<TecRmiData>;
  public
    constructor Create;
    destructor Destroy; override;
  published
    property SearchKey: string read FSearchKey write FSearchKey;
    property TooMuchResults: Boolean read FTooMuchResults write FTooMuchResults;
    property NumberOfResults: Integer read FNumberOfResults
      write FNumberOfResults;
    property NumberOfPossibleResults: Integer read FNumberOfPossibleResults
      write FNumberOfPossibleResults;
    property FoundData: TArray<TecRmiData> read FFoundData;
  end;
Und das deserialisieren
Code:
t := TKbaDataResult.Create;
valid := ObjectLoadJson(t, StringToUtf8(restRequest.Response.JSONText), TKbaDataResult);

mytbo 10. Jan 2024 17:54

AW: REST.Json extrem langsam?
 
Zitat:

Zitat von seb83 (Beitrag 1531764)
Mal umgebaut und auch extrem langsam >5s irgendwo muss da ein Problem drin stecken, obwohl das Objekt und alles vollkommen einfach sind.

Mit 500 Sub-Objekten wie vermutet ca. 5 Millisekunden. Der ganze Test-Case hier:
Delphi-Quellcode:
unit frm_Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
  mormot.core.base,
  mormot.core.data,
  mormot.core.json,
  mormot.core.rtti,
  mormot.core.test,
  mormot.core.perf,
  mormot.core.os;

type
  {$M+}
  TecRmiData = class
  private
    FTypeId: string;
    FTcdTypeId: string;
    FHerstSchluessel: string;
    FTypSchluessel: string;
    FVvs_Schluessel: string;
    FTypVvsPruefziffer: string;
    FFahrzeugklasse: string;
    FCodeAufbau: string;
    FFabrikMarke: string;
    FAmtlKlartextTyp: string;
    FVariante: string;
    FVersion: string;
    FHandelsName: string;
    FHerstText: string;
    FAmtlKlartextaufbau: string;
    FTxtKraftstoffKurz: string;
    FCodeKraftstoff: string;
    FHubraum: string;
    FAnzAchsen: string;
    FAbgasrichtlTg: string;
    FNationaleEmiklasse: string;
    FAntriebsachs: string;
    FNennleistungKw4: string;
    FNennleistungElektro30Min: string;
    FHoechstgeschwindigkeit: string;
    FAnzahlSitze: string;
    FMasseFahrbereitMin: string;
    FMasseFahrbereitMax: string;
    FTechZulGesamtMasse: string;
    FZulMaxAchsLast1: string;
    FZulMaxAchsLast2: string;
    FCo2Kombi: string;
    FStandgeraeusch3: string;
    FDrehStandgeraeusch: string;
    FFahrgeraeusch3: string;
    FTechnZulAnhaengerLastGebrem: string;
    FTechnZulAnhaengerLastUngebrem: string;
    FLeistungsGew: string;
    FLaengeMin: string;
    FLaengeMax: string;
    FBreiteMin: string;
    FBreiteMax: string;
    FHoeheMin: string;
    FHoeheMax: string;
    FStuetzLast: string;
    FBereifAchse1: string;
    FBereifAchse2: string;
    FGenehmigungsNr01: string;
    FGenehmigungsDat01: string;
    FBemerkungenAusnahmen: string;
    FAnmerkungen: string;
    FTxAnbringFzidnr: string;
    FBaumuster: string;
    FTxGetrTyp: string;
    FFelgeAchse1: string;
    FFelgeAchse2: string;
  published
    property TypeId: string
      read FTypeId write FTypeId;
    property TcdTypeId: string
      read FTcdTypeId write FTcdTypeId;
    property HerstSchluessel: string
      read FHerstSchluessel write FHerstSchluessel;
    property TypSchluessel: string
      read FTypSchluessel write FTypSchluessel;
    property Vvs_Schluessel: string
      read FVvs_Schluessel write FVvs_Schluessel;
    property TypVvsPruefziffer: string
      read FTypVvsPruefziffer write FTypVvsPruefziffer;
    property Fahrzeugklasse: string
      read FFahrzeugklasse write FFahrzeugklasse;
    property CodeAufbau: string
      read FCodeAufbau write FCodeAufbau;
    property FabrikMarke: string
      read FFabrikMarke write FFabrikMarke;
    property AmtlKlartextTyp: string
      read FAmtlKlartextTyp write FAmtlKlartextTyp;
    property Variante: string
      read FVariante write FVariante;
    property Version: string
      read FVersion write FVersion;
    property HandelsName: string
      read FHandelsName write FHandelsName;
    property HerstText: string
      read FHerstText write FHerstText;
    property AmtlKlartextaufbau: string
      read FAmtlKlartextaufbau write FAmtlKlartextaufbau;
    property TxtKraftstoffKurz: string
      read FTxtKraftstoffKurz write FTxtKraftstoffKurz;
    property CodeKraftstoff: string
      read FCodeKraftstoff write FCodeKraftstoff;
    property Hubraum: string
      read FHubraum write FHubraum;
    property AnzAchsen: string
      read FAnzAchsen write FAnzAchsen;
    property AbgasrichtlTg: string
      read FAbgasrichtlTg write FAbgasrichtlTg;
    property NationaleEmiklasse: string
      read FNationaleEmiklasse write FNationaleEmiklasse;
    property Antriebsachs: string
      read FAntriebsachs write FAntriebsachs;
    property NennleistungKw4: string
      read FNennleistungKw4 write FNennleistungKw4;
    property NennleistungElektro30Min: string
      read FNennleistungElektro30Min write FNennleistungElektro30Min;
    property Hoechstgeschwindigkeit: string
      read FHoechstgeschwindigkeit write FHoechstgeschwindigkeit;
    property AnzahlSitze: string
      read FAnzahlSitze write FAnzahlSitze;
    property MasseFahrbereitMin: string
      read FMasseFahrbereitMin write FMasseFahrbereitMin;
    property MasseFahrbereitMax: string
      read FMasseFahrbereitMax write FMasseFahrbereitMax;
    property TechZulGesamtMasse: string
      read FTechZulGesamtMasse write FTechZulGesamtMasse;
    property ZulMaxAchsLast1: string
      read FZulMaxAchsLast1 write FZulMaxAchsLast1;
    property ZulMaxAchsLast2: string
      read FZulMaxAchsLast2 write FZulMaxAchsLast2;
    property Co2Kombi: string
      read FCo2Kombi write FCo2Kombi;
    property Standgeraeusch3: string
      read FStandgeraeusch3 write FStandgeraeusch3;
    property DrehStandgeraeusch: string
      read FDrehStandgeraeusch write FDrehStandgeraeusch;
    property Fahrgeraeusch3: string
      read FFahrgeraeusch3 write FFahrgeraeusch3;
    property TechnZulAnhaengerLastGebrem: string
      read FTechnZulAnhaengerLastGebrem write FTechnZulAnhaengerLastGebrem;
    property TechnZulAnhaengerLastUngebrem: string
      read FTechnZulAnhaengerLastUngebrem write FTechnZulAnhaengerLastUngebrem;
    property LeistungsGew: string
      read FLeistungsGew write FLeistungsGew;
    property LaengeMin: string
      read FLaengeMin write FLaengeMin;
    property LaengeMax: string
      read FLaengeMax write FLaengeMax;
    property BreiteMin: string
      read FBreiteMin write FBreiteMin;
    property BreiteMax: string
      read FBreiteMax write FBreiteMax;
    property HoeheMin: string
      read FHoeheMin write FHoeheMin;
    property HoeheMax: string
      read FHoeheMax write FHoeheMax;
    property StuetzLast: string
      read FStuetzLast write FStuetzLast;
    property BereifAchse1: string
      read FBereifAchse1 write FBereifAchse1;
    property BereifAchse2: string
      read FBereifAchse2 write FBereifAchse2;
    property GenehmigungsNr01: string
      read FGenehmigungsNr01 write FGenehmigungsNr01;
    property GenehmigungsDat01: string
      read FGenehmigungsDat01 write FGenehmigungsDat01;
    property BemerkungenAusnahmen: string
      read FBemerkungenAusnahmen write FBemerkungenAusnahmen;
    property Anmerkungen: string
      read FAnmerkungen write FAnmerkungen;
    property TxAnbringFzidnr: string
      read FTxAnbringFzidnr write FTxAnbringFzidnr;
    property Baumuster: string
      read FBaumuster write FBaumuster;
    property TxGetrTyp: string
      read FTxGetrTyp write FTxGetrTyp;
    property FelgeAchse1: string
      read FFelgeAchse1 write FFelgeAchse1;
    property FelgeAchse2: string
      read FFelgeAchse2 write FFelgeAchse2;
  end;
  {$M-}

  TecRmiDataDynArray = array of TecRmiData;

type
  {$M+}
  TKbaDataResult = class(TObject)
  private
    FSearchKey: string;
    FTooMuchResults: Boolean;
    FNumberOfResults: Integer;
    FNumberOfPossibleResults: Integer;
    FFoundData: TecRmiDataDynArray;
  public
    destructor Destroy; override;
  published
    property SearchKey: string
      read FSearchKey write FSearchKey;
    property TooMuchResults: Boolean
      read FTooMuchResults write FTooMuchResults;
    property NumberOfResults: Integer
      read FNumberOfResults write FNumberOfResults;
    property NumberOfPossibleResults: Integer
      read FNumberOfPossibleResults write FNumberOfPossibleResults;
    property FoundData: TecRmiDataDynArray
      read FFoundData;
  end;
  {$M-}

type
  TfrmMain = class(TForm)
    btnSpeed: TButton;
    procedure btnSpeedClick(Sender: TObject);
  private
    FTimer: TPrecisionTimer;
  public
  end;

var
  frmMain: TfrmMain;

implementation

{$R *.dfm}

destructor TKbaDataResult.Destroy;
begin
  ObjArrayClear(FFoundData);
  inherited Destroy;
end;

procedure TfrmMain.btnSpeedClick(Sender: TObject);
begin
  var data: TKbaDataResult := TKbaDataResult.Create;
  try
    var jsonFileName: TFileName := ChangeFileExt(Executable.ProgramFileName, '.json');
    var json: RawJson := StringFromFile(jsonFileName);
    if json = '' then
    begin
      SetLength(data.FFoundData, 500);
      for var i: Integer := 0 to High(data.FFoundData) do
      begin
        data.FFoundData[i] := TecRmiData.Create;
        for var run: TRttiCustomProp in Rtti.ByClass[TecRmiData].Props.List do
          run.SetValueText(data.FFoundData[i], TSynTestCase.RandomIdentifier(10 + Random(20)));      
      end;

      if ObjectToJsonFile(data, jsonFileName) then
        json := StringFromFile(jsonFileName);
    end;  

    FTimer.Start;
    if ObjectLoadJson(data, json) then
      ShowMessage(Format('Total time Delphi: %s', [FTimer.Time]));
  finally
    data.Free;
  end;
end;

initialization
  Rtti.RegisterObjArrays([
    TypeInfo(TecRmiDataDynArray), TecRmiData]);

end.
PS: Bitte verweise im mORMot Forum auf diesen Thread und schließe deine Anfrage.

Bis bald...
Thomas


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:53 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