Benchmarking DOMDocument creation with PHP

Posted: September 19th, 2008 | Author: | Filed under: PHP | Tags: | 2 Comments »

Representing data as XML has several advantages, all of which are not in the scope of this post. We will test several ways of creating a DOMDocument instance with a simple XML document. We will not be discussing differences between DOMDocument or SimpleXML or any of the other ways available to build XML structures. This post is concerned with the building (no manipulation either) of a simple XML tree.

This is the source of the XML we are building:

			block1
			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi accumsan, lectus vel aliquam sodales, mi mauris euismod libero, nec egestas odio nisl non tortor. Sed vitae dui nec enim bibendum volutpat. Nulla congue dui id urna. Morbi at metus rutrum turpis mattis malesuada. Fusce at odio nec nulla condimentum lacinia. Curabitur vitae nibh in eros imperdiet vestibulum. Quisque tristique varius purus. Mauris scelerisque. Curabitur volutpat augue vitae leo. In purus eros, ultrices consequat, aliquam non, ornare eu, lorem. Praesent a ligula. Fusce sed est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec id sapien non lacus ullamcorper pharetra. Vivamus ac dolor et massa consectetuer tincidunt. Pellentesque consequat placerat lorem. Pellentesque ac tortor. In eleifend elementum metus. Aenean metus turpis, volutpat ut, feugiat quis, cursus in, leo. Sed quis leo. Praesent eget odio. Praesent sagittis. Donec ac mi. Morbi risus mauris, tempor sit amet, pulvinar quis, sollicitudin in, dolor. Nulla facilisi.
Nulla volutpat blandit dui. Nam sodales scelerisque nibh. Cras consectetuer viverra nisl. Vivamus semper congue urna. Suspendisse potenti. Proin ipsum magna, imperdiet ut, adipiscing a, scelerisque et, risus. Pellentesque adipiscing, mauris laoreet pellentesque elementum, felis nisi consectetuer pede, a pretium magna eros id neque. Aenean congue neque molestie nisi egestas faucibus. Pellentesque sollicitudin interdum felis. Integer vestibulum mi eu purus. Mauris sodales, arcu non posuere consequat, metus metus porta quam, eget posuere quam libero dictum nunc. Integer condimentum odio vel nisl. Mauris eget diam nec nisi tincidunt aliquam. Suspendisse imperdiet. Donec vestibulum mauris vel elit. Fusce sagittis nisi ac nisl. Mauris interdum, mauris vel elementum luctus, tellus ante pharetra ante, at auctor sem diam in augue.
Integer elementum tincidunt tortor. Mauris id odio ut nisi pellentesque feugiat. Quisque ligula nunc, dignissim non, euismod ac, pretium vitae, nisl. Mauris laoreet fringilla metus. Phasellus accumsan lectus in nisi. Duis adipiscing dui quis nulla. Integer dictum. Duis scelerisque. Maecenas eros pede, ullamcorper sit amet, pulvinar a, commodo at, ligula. Praesent mi ipsum, molestie sit amet, dictum ut, suscipit id, mauris. Morbi rhoncus, sapien ac bibendum mollis, libero elit aliquam ligula, vitae gravida mi libero eget neque. Donec tristique sapien. Nullam vulputate placerat diam. Etiam sodales massa vel velit. Vivamus ac nisi. Ut risus. Nullam neque elit, sodales eget, sollicitudin ut, imperdiet et, eros. Fusce at lectus suscipit augue molestie imperdiet. Vestibulum mattis vulputate magna. Nullam molestie, massa eget venenatis gravida, arcu pede viverra sapien, non lacinia mi ipsum eu est.
Proin nec lacus. Nunc ante. Pellentesque mattis posuere urna. Pellentesque facilisis nibh a nunc. Donec odio tortor, placerat vel, tempus quis, aliquet vel, nunc. Integer condimentum pellentesque ipsum. Ut condimentum ipsum vel pede. Integer ligula sem, cursus vel, rutrum in, pharetra sed, metus. Etiam a sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla dapibus, leo sed fringilla accumsan, ligula augue ornare augue, sed congue lorem nisi vel sapien. Phasellus eu risus vel velit commodo feugiat.

			block2
			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi accumsan, lectus vel aliquam sodales, mi mauris euismod libero, nec egestas odio nisl non tortor. Sed vitae dui nec enim bibendum volutpat. Nulla congue dui id urna. Morbi at metus rutrum turpis mattis malesuada. Fusce at odio nec nulla condimentum lacinia. Curabitur vitae nibh in eros imperdiet vestibulum. Quisque tristique varius purus. Mauris scelerisque. Curabitur volutpat augue vitae leo. In purus eros, ultrices consequat, aliquam non, ornare eu, lorem. Praesent a ligula. Fusce sed est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec id sapien non lacus ullamcorper pharetra. Vivamus ac dolor et massa consectetuer tincidunt. Pellentesque consequat placerat lorem. Pellentesque ac tortor. In eleifend elementum metus. Aenean metus turpis, volutpat ut, feugiat quis, cursus in, leo. Sed quis leo. Praesent eget odio. Praesent sagittis. Donec ac mi. Morbi risus mauris, tempor sit amet, pulvinar quis, sollicitudin in, dolor. Nulla facilisi.
Nulla volutpat blandit dui. Nam sodales scelerisque nibh. Cras consectetuer viverra nisl. Vivamus semper congue urna. Suspendisse potenti. Proin ipsum magna, imperdiet ut, adipiscing a, scelerisque et, risus. Pellentesque adipiscing, mauris laoreet pellentesque elementum, felis nisi consectetuer pede, a pretium magna eros id neque. Aenean congue neque molestie nisi egestas faucibus. Pellentesque sollicitudin interdum felis. Integer vestibulum mi eu purus. Mauris sodales, arcu non posuere consequat, metus metus porta quam, eget posuere quam libero dictum nunc. Integer condimentum odio vel nisl. Mauris eget diam nec nisi tincidunt aliquam. Suspendisse imperdiet. Donec vestibulum mauris vel elit. Fusce sagittis nisi ac nisl. Mauris interdum, mauris vel elementum luctus, tellus ante pharetra ante, at auctor sem diam in augue.
Integer elementum tincidunt tortor. Mauris id odio ut nisi pellentesque feugiat. Quisque ligula nunc, dignissim non, euismod ac, pretium vitae, nisl. Mauris laoreet fringilla metus. Phasellus accumsan lectus in nisi. Duis adipiscing dui quis nulla. Integer dictum. Duis scelerisque. Maecenas eros pede, ullamcorper sit amet, pulvinar a, commodo at, ligula. Praesent mi ipsum, molestie sit amet, dictum ut, suscipit id, mauris. Morbi rhoncus, sapien ac bibendum mollis, libero elit aliquam ligula, vitae gravida mi libero eget neque. Donec tristique sapien. Nullam vulputate placerat diam. Etiam sodales massa vel velit. Vivamus ac nisi. Ut risus. Nullam neque elit, sodales eget, sollicitudin ut, imperdiet et, eros. Fusce at lectus suscipit augue molestie imperdiet. Vestibulum mattis vulputate magna. Nullam molestie, massa eget venenatis gravida, arcu pede viverra sapien, non lacinia mi ipsum eu est.
Proin nec lacus. Nunc ante. Pellentesque mattis posuere urna. Pellentesque facilisis nibh a nunc. Donec odio tortor, placerat vel, tempus quis, aliquet vel, nunc. Integer condimentum pellentesque ipsum. Ut condimentum ipsum vel pede. Integer ligula sem, cursus vel, rutrum in, pharetra sed, metus. Etiam a sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla dapibus, leo sed fringilla accumsan, ligula augue ornare augue, sed congue lorem nisi vel sapien. Phasellus eu risus vel velit commodo feugiat.

			block1
			Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi accumsan, lectus vel aliquam sodales, mi mauris euismod libero, nec egestas odio nisl non tortor. Sed vitae dui nec enim bibendum volutpat. Nulla congue dui id urna. Morbi at metus rutrum turpis mattis malesuada. Fusce at odio nec nulla condimentum lacinia. Curabitur vitae nibh in eros imperdiet vestibulum. Quisque tristique varius purus. Mauris scelerisque. Curabitur volutpat augue vitae leo. In purus eros, ultrices consequat, aliquam non, ornare eu, lorem. Praesent a ligula. Fusce sed est. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.
Donec id sapien non lacus ullamcorper pharetra. Vivamus ac dolor et massa consectetuer tincidunt. Pellentesque consequat placerat lorem. Pellentesque ac tortor. In eleifend elementum metus. Aenean metus turpis, volutpat ut, feugiat quis, cursus in, leo. Sed quis leo. Praesent eget odio. Praesent sagittis. Donec ac mi. Morbi risus mauris, tempor sit amet, pulvinar quis, sollicitudin in, dolor. Nulla facilisi.
Nulla volutpat blandit dui. Nam sodales scelerisque nibh. Cras consectetuer viverra nisl. Vivamus semper congue urna. Suspendisse potenti. Proin ipsum magna, imperdiet ut, adipiscing a, scelerisque et, risus. Pellentesque adipiscing, mauris laoreet pellentesque elementum, felis nisi consectetuer pede, a pretium magna eros id neque. Aenean congue neque molestie nisi egestas faucibus. Pellentesque sollicitudin interdum felis. Integer vestibulum mi eu purus. Mauris sodales, arcu non posuere consequat, metus metus porta quam, eget posuere quam libero dictum nunc. Integer condimentum odio vel nisl. Mauris eget diam nec nisi tincidunt aliquam. Suspendisse imperdiet. Donec vestibulum mauris vel elit. Fusce sagittis nisi ac nisl. Mauris interdum, mauris vel elementum luctus, tellus ante pharetra ante, at auctor sem diam in augue.
Integer elementum tincidunt tortor. Mauris id odio ut nisi pellentesque feugiat. Quisque ligula nunc, dignissim non, euismod ac, pretium vitae, nisl. Mauris laoreet fringilla metus. Phasellus accumsan lectus in nisi. Duis adipiscing dui quis nulla. Integer dictum. Duis scelerisque. Maecenas eros pede, ullamcorper sit amet, pulvinar a, commodo at, ligula. Praesent mi ipsum, molestie sit amet, dictum ut, suscipit id, mauris. Morbi rhoncus, sapien ac bibendum mollis, libero elit aliquam ligula, vitae gravida mi libero eget neque. Donec tristique sapien. Nullam vulputate placerat diam. Etiam sodales massa vel velit. Vivamus ac nisi. Ut risus. Nullam neque elit, sodales eget, sollicitudin ut, imperdiet et, eros. Fusce at lectus suscipit augue molestie imperdiet. Vestibulum mattis vulputate magna. Nullam molestie, massa eget venenatis gravida, arcu pede viverra sapien, non lacinia mi ipsum eu est.
Proin nec lacus. Nunc ante. Pellentesque mattis posuere urna. Pellentesque facilisis nibh a nunc. Donec odio tortor, placerat vel, tempus quis, aliquet vel, nunc. Integer condimentum pellentesque ipsum. Ut condimentum ipsum vel pede. Integer ligula sem, cursus vel, rutrum in, pharetra sed, metus. Etiam a sem. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nulla dapibus, leo sed fringilla accumsan, ligula augue ornare augue, sed congue lorem nisi vel sapien. Phasellus eu risus vel velit commodo feugiat.

		gerrit
		test
		2

It consists of a number of tags, some attributes and a fair bit of content in some of the tags. Each tag may be seen as an XML representation of a class instance.

During testing, all content is provided in a nested array, which should be obvious from the example. The array is the same for each method. Three ways of building the XML into a DOMDocument tested are:
Using the native DOMDocument functionality:

$oDomDoc = new DOMDocument();
$oRoot = $oDomDoc->createElement('root');
for ($i = 1; $i < 5; $i++)
	$oRoot->setAttribute('att'.$i, $asValue['att'.$i]);

$oBlocks = $oDomDoc->createElement('blocks');
foreach ($asValue['block'] as $asBlock){
	$oBlock = $oDomDoc->createElement('block');
	$oBlock->appendChild($oDomDoc->createElement('name', $asBlock['name']));
	$oBlock->appendChild($oDomDoc->createElement('content', $asBlock['content']));
	$oBlocks->appendChild($oBlock);
}
$oRoot->appendChild($oBlocks);

$oAdmin = $oDomDoc->createElement('admin');
$oAdmin->appendChild($oDomDoc->createElement('name', $asValue['admin']['name']));
$oAdmin->appendChild($oDomDoc->createElement('value', $asValue['admin']['value']));
$oAdmin->appendChild($oDomDoc->createElement('id', $asValue['admin']['id']));
$oRoot->appendChild($oAdmin);

$oDomDoc->appendChild($oRoot);

Using this method each class can implement some Class::toXML(DOMDocument) method, which may be called recursively. Hint: before appending a node to the XML tree, make sure all child-nodes are in place, as each time a child-node is appended to a parent-node, the entire tree will be searched for the parent-node.

Build a string and load the final string into the DOMDocument using DOMDocument::load(String). Two ways have been tested: just append to a string, which may lead to not-so-nice-looking code, and a format string, which can for instance be implemented neatly as a class constant.
String method:

$sBlockXML = '';
foreach ($asValue['block'] as $asBlock)
	$sBlockXML .= ''.$asBlock['name'].''.$asBlock['content'].'';
$asAdmin = $asValue['admin'];
$sAdminXML = ''.$asAdmin['name'].''.$asAdmin['value'].''.$asAdmin['id'].'';
$sStringXML = ''.$sBlockXML.''.$sAdminXML.'';

$oStringXML = DOMDocument::loadXML($sStringXML);

Format string method:

define('ROOT_XML', '%s%s');
define('BLOCK_XML', '%s%s');
define('ADMIN_XML', '%s%s%s');

$sBlockXML = '';
foreach ($asValue['block'] as $asBlock)
	$sBlockXML .= sprintf(BLOCK_XML, $asBlock['name'], $asBlock['content']);
$asAdmin = $asValue['admin'];
$sAdminXML = sprintf(ADMIN_XML, $asAdmin['name'], $asAdmin['value'], $asAdmin['id']);

$oSPFDoc = DOMDocument::loadXML(sprintf(ROOT_XML,
	$asValue['att1'],
	$asValue['att2'],
	$asValue['att3'],
	$asValue['att4'],
	$sBlockXML,
	$sAdminXML));

(An possible use for this last method is that one may define a class constant for each type of output, e.g. XML and JSON and…, which may all be handled in the same transparent way, e.g. in a superclass.)

Each of de code above was run 1000 times.

Test environment:
Intel(R) Celeron(R) M processor 1.30 GHz
2.0 GiB memory
php 5.2.4-2ubuntu5.3

Results

DOMDocument 0.46423 sec.
String 0.21128 sec.
Formatstring 0.24149 sec.

Conclusions

Creating an XML representation in a DOMDocument is fasted if the entire string is created first, and loaded into the DOMDocument right at the end, beating the “proper” construction by a factor of at least two. The performance difference between string and formatstring is evident, but not too big.


2 Comments on “Benchmarking DOMDocument creation with PHP”

  1. 1 AndrewBoldman said at 4:42 pm on June 4th, 2009:

    Hi, good post. I have been wondering about this issue,so thanks for posting.

  2. 2 JaneRadriges said at 5:30 am on June 14th, 2009:

    Hi, gr8 post thanks for posting. Information is useful!