OXml - The next generation XML library for Pascal

vložil Radek Červinka 7. ledna 2014 21:09

Ondřej Pokorný aka kluug.net napsal novou knihovnu pro práci s XML, která by měla být nejrychlejší a nejkomplexnější nativní knihovnou pro práci s XML pro Delphi a FreePascal pro Win32, Win64, OSX, iOS, Android. Testovány jsou Delphi 7, 2007, 2009, 2010, XE, XE2, XE3, XE4, XE5 a Lazarus 1.0

OXml obsahuje SAX parser, DOM implementation, sekvenční DOM parser a přímý XML reader/writer.

  • nativní object pascal
  • bez externích závislostí
  • bez závislostí na VCL, LCL nebo FMX.
  • plná podpora unicode pro D6-D2007.
  • výkoná podpora XPath

Domovská stránka OXML je kluug.net/oxml.php.

Tagy: ,

Komponenty

Komentáře

8.1.2014 22:55:13 #

geby

Opravdu je to rychlejsi nez http://www.audio-data.de/simplexml.html ? (To jsem zrovna loni vyhodnotil jako nejrychlejsi dospelou implementaci.)

geby

9.1.2014 0:11:35 #

Daniel Andrascik

Ja zase dost s oblubou pouzivam NativeXML http://www.simdesign.nl/xml.html . Netvrdim ze je to najrychlejsia implementacia ale pomala rozhodne nie je a ma dost hodne uzitocnych features...

Daniel Andrascik

9.1.2014 10:02:57 #

radekc

Nevím, ale doneslo se mi, že byla zvažována její integrace do Delphi knihovny. Jak to dopadlo (dopadne) nevím.

radekc

9.1.2014 14:48:05 #

oxo

@geby: O SimpleXML jsem neveděl, není nic jednoduššího, než vyzkoušet load/save:

SimpleXML DOM
Whole: 1,747
Read: 0,967
Write: 0,78

OXml record DOM (default)
Whole: 1,856
Read: 1,31
Write: 0,546

Ve čtení mám očividně ještě rezervy.

---
Ale SimpleXML má jeden zásadní problém: nefunguje při "Owerflow checking = True" a "Range checking= True" - hází mi "Integer overflow" v TXmlDocument.Create ...

oxo

9.1.2014 15:23:34 #

radekc

@oxo - nechci ti do toho kecat, ale ten sampling profiler je fakt bomba a nemusíš nic upravovat. Často mi v takových situacích ukázal kde je zakopaný CPU čas a zrovna v tvém případě by se to dalo dobře provést, jelikož to můžeš zkoušet jako samostatný program. Ale jak říkám: nechci ti do toho kecat.

radekc

9.1.2014 15:28:36 #

oxo

Teď jsem se koukal na zdroj SimpleXML, atributy neukládá jako potomka TXmlNode/IXmlNode a tím získá jistou rychlostní výhodu, ale není to podle DOM 1 (z principu pak nemůže správně fungovat XPath, pokud ji vůbec podporuje). Taky hodnoty attributů neukládá do globální TXmlNameTable, ale pro každý zvlášť. Proto taky SimpleXML potřebuje asi 2x více paměti (pro můj testovací soubor 5,8 MB):

SimpleXML: 76 MB
OXml: 38 MB

A ještě jsem si zkusil vytvořit asi 500'000 elementů:

VerySimpleXML DOM: 0,889 s / 118 MB
OXml record DOM: 0,702 s / 50 MB


Ale parser má rychlejší. Zkusím zjistit proč :)

oxo

9.1.2014 15:31:41 #

oxo

@radekc: sampling profiler používám http://www.delphitools.info/samplingprofiler/

máš kdyžtak ještě i nějaký jiný (lepší) tip?

oxo

9.1.2014 15:56:53 #

radekc

Ne, ale dá se někde vystavit testovací příklad  (ready to compile) včetně toho tvého XML, prostě jen tak na pohráti s optimalizací? Myslím, že je to zajímavá výzva - tedy aspoň pro mne.

radekc

9.1.2014 20:14:16 #

geby

Tak SimpleXML je uz podle nazvu Simple. Takze nejaky XPATH mne fakt netankuje. Podstatne je, aby umel parsovat libovolne XML, nerozhodily jej ruzne znakove sady, umel spravne pracovat s CDATA a umel mi najit a vratit libovolny node a jeho atributy. A taky, aby byl co nejvice benevolentni vuci ruznym formalnim chybam v nacitanem XML.

SimpleXML jsem navic naucil jakysi hybridni rezim, ktery pouzivam pri parsovani obrovskych datovych souboru. Takovych XMl souboru, kde je velke mnozstvi podobnych zaznamu zasebou. (typicky, treba nejaka databaze.) Tam totiz pracuji tak, ze jakmile dokoncim parsovani jednoho zaznamu, tak si eventem odskocim do sveho programu, kde ten jeden zaznam zpracuji a prectu. A na konci jej z pameti smazu, nacez pokracuji v parsovani puvodniho XML souboru. a tak porad dokolecka.

Vyhodou je, ze dokazu zpracovat i obrovske soubory, ktere by se mi cele rozparsovane ani do pameti nevesly, s tim, ze pametove naroky odpovidaji jen jednomu zaznamu v XML, tedy naprosto legracni. A pritom v ramci jednoho zaznamu neprichazim o vyhody DOM parsingu, neni to SAX.

geby

9.1.2014 20:26:19 #

geby

K tomu vykonu - zkousel jsi u SimpleXMl plnou verzi, nebo tu betu? Ta plna verze ma totiz rozhodne jeste velke rezervy ve vykonu. neco z toho se pokousi vylepsovat redesign v te betaverzi, ale tu jsem sam jeste nezkousel.

geby

10.1.2014 14:49:31 #

oxo

@Geby: jo jistě. Koukal jsem se na SimpleXML a musím říct, že to mají vymyšlené hodně dobře.
K hybridnímu módu: ten mám taky a automatický :) - OXmlSeq.pas

Pohrál jsem si s optimalizací a tady mám výsledky testu z Delphi XE2: (Ten ready-to-compile test je v demu, Radku). Hodnoty v sekundách, menší je rychlejší.


SimpleXML DOM
Whole: 1,576
Read: 1,045
Write: 0,531

OXml record DOM (default)
Whole: 1,404
Read: 0,873
Write: 0,531

OXml SAX
Read: 0,858

OXml direct reader/writer
Read: 0,624


Vytváření elementů v OXml je asi 2x tak rychlejší než v SimpleXML, z toho vyplívá, že parser mám pravděpodobně pomalejší - vy výsledku to vyjde skoro nastejno. To pomalejší čtení bude nejspíš tím, že parser je "standalone" (mezi DOM a parserem se musí přehazovat stringy) a taky, že nemůžu optimalizovat až na PChar, protože OXml je i pro Android/iOS a tam to asi moc nefunguje.

Víc optimalizovat schopen nejsem.

V non-unicode Delphi je OXml pomalejší - tam se projeví pomalost WideStringů (SimpleXML je šikovně obchází). Test pro Delphi 7 (zapnuté XML_WIDE_CHARS v SimpleXML):

SimpleXML DOM
Whole: 2,293
Read: 1,232
Write: 1,061

OXml record DOM (default)
Whole: 3,915
Read: 2,371
Write: 1,544

OXml SAX
Read: 2,652

OXml direct reader/writer
Read: 1,67


Všechny testy jsou k betě SimpleXML a po mých posledních optimalizacích OXml (ještě jsem je nenahrával na internet). Tento performance test je v demu, Radku.

oxo

10.1.2014 23:33:33 #

geby

Tak to vypada jako dobra prace!

geby

Komentování ukončeno

Naše nabídka

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy).

love Delphi

O Delphi.cz

Delphi je moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64, Mac OSX, Linux a na iPhone a Android.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Poslední komentáře

Comment RSS

Dle měsíců