<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Rein&#039;s Cyberspaceplace &#187; Performance</title>
	<atom:link href="http://www.velt.org/archives/tag/performance/feed" rel="self" type="application/rss+xml" />
	<link>http://www.velt.org</link>
	<description>PHP, electronics, embedded software, Mechanic Apes and more....</description>
	<lastBuildDate>Thu, 28 Apr 2011 10:25:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Localiseren van performance bottlenecks met XDebug en Cachegrind</title>
		<link>http://www.velt.org/archives/65</link>
		<comments>http://www.velt.org/archives/65#comments</comments>
		<pubDate>Tue, 16 Sep 2008 16:11:33 +0000</pubDate>
		<dc:creator>Rein</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[benchmarking]]></category>
		<category><![CDATA[Cachegrind]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[troubleshooting]]></category>
		<category><![CDATA[Valgrind]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Regelmatig krijg ik van mijn opdrachtgevers het verzoek om te bepalen waarom een bepaalde PHP applicatie niet voldoende performance heeft. Om iets zinnigs over de performance bottlenecks in je applicatie te kunnen zeggen moet je gaan meten hoe lang PHP er over doet om bepaalde instructies uit te voeren. In dit document probeer ik uit [...]]]></description>
			<content:encoded><![CDATA[<p>Regelmatig krijg ik van mijn opdrachtgevers het verzoek om te bepalen waarom een bepaalde PHP applicatie niet voldoende performance heeft. Om iets zinnigs over de performance bottlenecks in je applicatie te kunnen zeggen moet je gaan meten hoe lang PHP er over doet om bepaalde instructies uit te voeren. In dit document probeer ik uit te leggen uit dat globaal in zijn werk gaat. </p>
<p><!--break--><br />
<br/><br />
<br/><br />
<br/></p>
<h3>Wat heb je nodig?</h3>
<p>Om een applicatie te kunnen profilen heb je een tweetal tools nodig</p>
<ul>
<li><a href="http://www.xdebug.org">Xdebug</a></li>
<li>Cachegrind (<a href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi">Kcachegrind voor Linux</a>, <a href="http://sourceforge.net/projects/wincachegrind/">WinCachegrind voor Windows</a>)</li>
</ul>
<p>Onder Ubuntu kun je deze installeren via de volgende twee commando&#039;s:</p>
<pre>
sudo apt-get install php5-xdebug
sudo apt-get install kcachegrind
</pre>
<p><br/><br />
<br/><br />
<br/></p>
<h3>Configureren</h3>
<p>
Je kunt de xdebug profiler aanzetten door de volgende regels toe te voegen aan php.ini</p>
<pre>
//hiermee zet je de xdebug profiler aan
xdebug.profiler_enable=1

//De volgende opties zijn optioneel
xdebug.profiler_enable_trigger=1
xdebug.profiler_output_name="timestamp"
</pre>
<p>Enable trigger zorgt ervoor dat de applicatie aan een profile log aanmaakt indien de URL parameter <strong>XDEBUG_PROFILE</strong><br />
wordt meegegeven. Je kunt dus zelf bepalen welk script je wilt profilen. Profiler_output_name zorgt ervoor dat de profile log een timestamp in de bestandsnaam heeft zodat je snel kunt zien welke log de juiste is.
</p>
<p>
Als alles goed geinstalleerd is dan zal in de output van phpinfo() het volgende te zien zijn:</p>
<table border="1">
<tr>
<td>xdebug.profiler_append</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>xdebug.profiler_enable</td>
<td><strong>On</strong></td>
<td><strong>On</strong></td>
</tr>
<tr>
<td>xdebug.profiler_enable_trigger</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>xdebug.profiler_output_dir</td>
<td>/tmp</td>
<td>/tmp</td>
</tr>
<tr>
<td>xdebug.profiler_output_name</td>
<td>cachegrind.out.%p</td>
<td>cachegrind.out.%p</td>
</tr>
</table>
<p><br/><br />
<br/><br />
<br/></p>
<h3>Een simpel voorbeeld</h3>
<p>In het onderstaande voorbeeld zie je eens stukje script dat verbinding maakt met een MySQL database en een aantal records opvraagt<br />
<code><br />
<?php</p>
<p>	function test2()<br />
	{<br />
        	mysql_connect(&#039;localhost&#039;,&#039;username&#039;,&#039;secret&#039;);<br />
        	mysql_select_db(&#039;mysql&#039;);<br />
        	$queryresult=mysql_query("select * from help_keyword");<br />
        	while ($row=mysql_fetch_object($queryresult))<br />
        	{<br />
                	print_r($row);<br />
        	}<br />
	}</p>
<p>	test2();<br />
?><br />
</code><br />
Als je dit script uitvoert via je browser dan wordt er in de /tmp folder een cachegrind.out bestand gegenereerd. Dit bestand kan geopend worden met Cachegrind. In Cachegrind krijg je dan het volgende scherm te zien:<br/><br/><br />
<img src="http://phpgg.nl/files/images/Screenshot.preview.png" title="Cachegrind screenshot"/><br/><br />
<img src="http://phpgg.nl/files/images/output1_0.preview.png" title="Cachegrind output"/><br/><br/><br />
Je kunt nu per functie zien hoeveel processortijd het kost om hem uit te voeren. Hierdoor krijg je goed zicht op de functies die het meeste vertraging in je script veroorzaken.<br />
<br/><br />
<br/><br />
<br/></p>
<h3>Meer informatie over dit onderwerp</h2>
<ul>
<li><a href="http://kcachegrind.sourceforge.net/cgi-bin/show.cgi">KCachegrind website</a></li>
<li><a href="http://sourceforge.net/projects/wincachegrind/">WinCachegrind website</a></li>
<li><a href="http://www.xdebug.org/docs/profiler">Xdebug manual</a>, Derick Rethans</li>
<li><a href="http://talks.php.net/show/phpuk07/0">Fast and Rich (Web Applications with PHP 5)</a>, Rasmus Lerdorf</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.velt.org/archives/65/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

