SimpleXML vs XMLWriter vs DOM
I have done a little Performance test for the 3 different methods available in PHP for XML generation. For this test I wrote a little script which generates the same XML File using the different methods.
<?php
function printMemory()
{
echo "Used " . (memory_get_peak_usage() / 1024 / 1024) . " MB\n";
}
function simpleXMLTest($nodes, $subnodes)
{
$xml = new SimpleXMLElement("<?xml version=\"1.0\" encoding=\"utf-8\" ?><resultset/>");
for ($i=0; $i<$nodes; $i++) {
$node = $xml->addChild('feed' . $i);
for ($j=0; $j<$subnodes; $j++) {
$subnode = $node->addChild('feed' . $j);
$subnode->addAttribute('feed', $j);
}
}
printMemory();
file_put_contents('/tmp/_test.xml', $xml->asXML());
}
function XMLWriterTest($nodes, $subnodes)
{
$xml = new XMLWriter();
$xml->openMemory();
$xml->startDocument('1.0', 'UTF-8');
$xml->startElement('resultset');
for ($i=0; $i<$nodes; $i++) {
$xml->startElement('test' . $i);
for ($j=0; $j<$subnodes; $j++) {
$xml->startElement('test' . $j);
$xml->writeAttribute('test', $j);
$xml->endElement();
}
$xml->endElement();
}
$xml->endElement();
printMemory();
file_put_contents('/tmp/_test.xml', $xml->outputMemory(true));
}
function DOMTest($nodes, $subnodes)
{
$dom = new DOMDocument('1.0', 'utf-8');
$resultset = $dom->createElement('resultset');
for ($i=0; $i<$nodes; $i++) {
$node = $dom->createElement('test' . $i);
for ($j=0; $j<$subnodes; $j++) {
$subnode = $dom->createElement('test' . $j);
$subnode->setAttribute('test', $j);
$node->appendChild($subnode);
}
$resultset->appendChild($node);
}
$dom->appendChild($resultset);
printMemory();
file_put_contents('/tmp/_test.xml', $dom->saveXML());
}
$nodes = 1000;
$subnodes = 100;
$start = microtime(true);
//simpleXMLTest($nodes, $subnodes);
//XMLWriterTest($nodes, $subnodes);
//DOMTest($nodes, $subnodes);
$end = microtime(true) - $start;
echo "Took " . $end . " ms\n";
-
Test: 1000 Nodes with 100 Subnodes for each Node. (XML Filesize: 1.9MB)
SimpleXML XMLWriter DOM Time 0.48202991485596 ms 0.36775803565979 ms 0.72811722755432 ms Memory 0.6109619140625 MB 0.61136627197266 MB 0.6141357421875 MB -
Test: 1000 Nodes with 1000 Subnodes for each Node. (XML Filesize: 20MB)
SimpleXML XMLWriter DOM Time 4.867399930954 ms 3.5637412071228 ms 7.1697089672089 ms Memory 0.6109619140625 MB 0.61136627197266 MB 0.6141357421875 MB -
Test: 10000 Nodes with 1000 Subnodes for each Node. (XML Filesize: 199MB)
SimpleXML XMLWriter DOM Time 129.83511686325 ms 38.820327997208 ms 365.01518082619 ms Memory 0.6109619140625 MB 0.61136627197266 MB 0.6141357421875 MB
After this Tests, we can see that DOM is not an optimal method for XML generation. DOM with small files needs +0.40 seconds more then XMLWriter, and SimpleXML needs only +0.08 seconds more.
With bigger files, XMLWriter is much faster than the other two methods. So if you need to create big XML files, the best solution is XMLWriter








