Bij het inlezen van een XML bestand moet je parser gaan zoeken naar een start-tag die "<" is, dat wil dus zeggen, een hoop karaktertjes gaan vergelijken.dan moet hij de naam extracten, die gedelimit is met een spatie of een > als er geen argumenten zijn bij die tag. Dan moet hij alle argumenten als text inlezen, parameter en waarde splitsen op een '=' teken, tot hij een "/>" of ">" tegenkomt. En dan hebben we enkel nog maar de opening tag. Dit vergt een pak meer tijd dan gewoon een binair formaat te lezen en te schrijven, waar de lengtes van velden snel en makkelijk te lezen zijn.
Bij een binair formaat moet je geen whitespace skippen, cijfers zijn gewoon binair opgeslagen, wat wil zeggen fixed-length 2 of 4 bytes, zoeken naar het einde, geen parsing en controle of het wel numeriek is, ... Voor een string-waardes of gewoon binaire data zet je er gewoon voor hoe lang ze is, wat 1, 2 of 4 bytes overhead heeft afhankelijk wat nodig is - maar een pak sneller is omdat je geen start en end-string quotes gaan zoeken, escaping of ander conversie-schema gaan toepassen, geen base64 decoding, ... wat het allemaal enorm vertraagt. Daardoor heb je een pak minder memory nodig voor het parsen, en kan je library in een taal zoals C(++) direct gaan mappen met pointertjes in je file-structuur na een snelle tree-parsing gedaan te hebben, en moet je de data niet inlezen, parsen en kopieren in memory. Enkel endianess wordt dan een probleem, maar ik veronderstel dat men dan gewoon Big-Endian gaat gebruiken voor numerieke gegevens op te slagen, vermits dit overal ongeveer de standaard is (buiten op pc natuurlijk - intel moest weer eens het anders doen)
Nog een commonly-used techniek bij XML die vertraagt is deze stream-zippen en unzippen voor dit verstuurt wordt over een netwerk, dus komt daar nog eens het comprimeren en decomprimeren bij, wat bij een binair formaat nog altijd mogelijk is (en levert in veel gevallen nog altijd serieus wat op), maar het zal zo hard niet meer nodig zijn. Veel XML-files bevatten zo een hoop white-spaces om het leesbaar te maken dat je daar enorm veel bloat mee creeert.
Ik heb het al gezien, een klant die een export vraagt van bepaalde gegevens van een systeem, en zou dit liefst in XML zien (da's waar het voor gemaakt is), wordt er intern in het bedrijf beslist (gepusht door een XML-freak) om het hele interne protocol van hun project dan maar ineens om te zetten naar een XML-formaat, voor "de toekomst". Voordien was dit een bliksemsnel binair formaat dat deed wat het moest doen, en waar al lang geen problemen meer mee waren. De implementatie is vrij vlot gegaan, en enkele maanden later had men dit XML-protocol draaiten op een test-systeem, waar weinig problemen mee waren qua functionaliteit. In test werden er gewoon geen problemen gevonden - tot men het systeem een "real world" stresstest liet ondergaan. Het ding ging op zijn knieen bij 600/700 connecties, waar dit voordien makkelijk 10 keer zoveel haalde. Het probleem was, de klant had wel degelijk 5 keer zoveel connecties nodig, zo'n 3000... Men had "geluk" dat de library die men gebruikte XML-accelerators ondersteunde, wat betekende dat je effe een PCI-kaartje bij in je bak kon rammen om je XML-parsing te versnellen. Alleen al het feit dat dit bestaat vind ik vrij surrealistisch - hardware-acceleratie voor een data/file-formaat? Dat je dit voor een low-level protocol hebt zoals TCP/IP kan ik geloven, vermits quasi elke pc op deze aardbol dit gebruikt, en dit zeer low-level is, maar XML???
Ander geluk was had een van de andere developers hard genoeg zijn wil doorgedrukt en het protocol in een virtualisatie-layer te steken, waardoor men kon kiezen tussen XML en het "oude" protocol. Voor de klant heeft men uiteindelijk gewoon een stomme export geschreven - wa 2 dagen heeft geduurt incl testing - en da werkte gewoon...
XML is handig als "data-exchange" - maar nie voor netwerk-protocols zoals SOAP en andere zaken waar het misbruikt voor wordt, dat is gewoon te belachelijk om los te lopen. Zolang je server geen XML-parsing moet doen, enkel de client - geen probleem, die hebben meestal toch CPU-power teveel tegenwoordig, maar op server zware XML-parsing doen heeft nie veel positieve effecten op performance...