so, nun ist auch das En-/Decoding nehezu komplett überarbeitet worden
(
unvollständige MultiByte-Zeichen erkennen)
und auch die Speicherprozedur würde etwas gendärt ... nur blöd, daß die Dekodierung garnicht sooooo langsam war ... aktuell nur etwa 60-70 ms für's Dekodieren und Speichern ... das Meißte an Plus wurde durch 'ne winzig kleine Änderung rausgeholt .... ich hatte ausversehn nach jedem Node ein Flush (Schreibpuffer leeren) drin ... also so etwa 35 Dekodier-/Speicheroperationen wurde dieses über 100.000 Mal in sehr kleinen Stücken gemacht
ja und Node.Next war sehr disoptimal (2-3 Sekunden für .Next und nochmal knapp 7-8 für's Flush)
hier nochmal die Testergebnisse für 100.000 Nodes (ergibt ca. eine 1,5 MB-Datei)
Code:
[b]alt[/b]
TXMLDocument = fill:672687 save: 391 free: 140
TXMLFile = fill: 125 save:10922 free:3110
[b]TXMLDocument/IXMLDocument[/b]
Taskmanager: 11,5 Minuten mit bis zu 138 MB Speicherverbrauch
fill:692875 save:360 free:125
[b]himXML[/b]
Taskmanager: 3 Sekunden mir nur 22 MB
fill:110 save:125 free:2812
(Zeiten in Millisekunden)
aktueller Code kommt mit dem nächten Update und eventuell schon zusammen mit der Leseroutine (LoadFromFile und Co.)
[add]
so, noch 'ne kleine Änderung in NodeList.Clear
(einfach alles löschen und zusammen entfernen, statt einzeln entfernen und löschen)
Delphi-Quellcode:
// alt
Procedure TXMLNodeList.Clear;
Begin
While _Nodes <>
nil do DeleteNF(_Nodes[0]);
End;
// neu
Procedure TXMLNodeList.Clear;
Var i: Integer;
Begin
If _Nodes <>
nil Then
Try
For i := High(_Nodes)
downto 0
do FreeAndNil(_Nodes[i]);
_Nodes :=
nil;
Except
i := Length(_Nodes);
While (i > 0)
and (_Nodes[i - 1] =
nil)
do Dec(i);
SetLength(_Nodes, i);
Raise;
End;
End;
Ergebnis:
Code:
create:0 fill:109 save:125 free:31
also 0,26 Sekunden, statt über 11 Minuten bei
MSXML (TXMLDocument), um 100.000 Nodes einzufügen und diese 1,5 MB-Datei zu speichern