<?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>BBProject.net &#187; funkcja</title>
	<atom:link href="http://www.bbproject.net/tag/funkcja/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bbproject.net</link>
	<description>Programowanie, webmastering, informatyka</description>
	<lastBuildDate>Tue, 01 Mar 2011 20:35:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>If&#8230;else czy return?</title>
		<link>http://www.bbproject.net/2010/03/if-else-czy-return/</link>
		<comments>http://www.bbproject.net/2010/03/if-else-czy-return/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 11:03:18 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Laboratorium]]></category>
		<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[funkcja]]></category>
		<category><![CDATA[instrukcja warunkowa]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=112</guid>
		<description><![CDATA[Trudno wymyślić sensowny tytuł dla zagadnienia które chcę opisać. Zawsze zastanawiało mnie czy pisząc w PHP funkcję która początkowo przeprowadza walidację przekazanych argumentów, stosować konstrukcję typu: function nazwa($argument) { if (warunek) { return FALSE; } ... ciało funkcji } &#8230;czy też: function nazwa($argument) { if (warunek) { return FALSE; } else { ... ciało funkcji [...]]]></description>
			<content:encoded><![CDATA[<p>Trudno wymyślić sensowny tytuł dla zagadnienia które chcę opisać. Zawsze zastanawiało mnie czy pisząc w PHP funkcję która początkowo przeprowadza walidację przekazanych argumentów, stosować konstrukcję typu:</p>
<pre class="brush: php">function nazwa($argument)
{
  if (warunek)
  {
    return FALSE;
  }
  ... ciało funkcji
}</pre>
<p>&#8230;czy też:</p>
<pre class="brush: php">function nazwa($argument)
{
  if (warunek)
  {
    return FALSE;
  }
  else
  {
    ... ciało funkcji
  }
}</pre>
<p>Intuicyjnie może się wydawać że pierwszy metoda będzie działać szybciej, gdyż po spełnieniu warunku wychodzimy od razu z funkcji &#8211; parser nie musi przetwarzać reszty kodu. Z kolei w drugiej, mimo iż to co znajduje się w bloku <em>else</em> się nie wykona i tak musi zostać przeczytane przez PHP. Jak jest w rzeczywistości? Sprawdźmy to!</p>
<p><span id="more-112"></span>Pierwsza konstrukcja, w której po spełnieniu warunku wykluczającego dalsze przetwarzanie, od razu zwracamy wartość jest na pewno bardziej przejrzysta. Nie musimy ciągnąć za sobą nawiasu kończącego blok <em>else</em> przez całą resztę instrukcji. Drugi fragment kodu z kolei charakteryzuje się bardziej logiczniejszą strukturą &#8211; gdyż wyraźnie widzimy co się stanie w przypadku spełnienia warunku jak i jego odrzucenia.</p>
<p>Przejdźmy zatem do testów. Przygotowałem na tą okazję dwie, identyczne pod względem działania, funkcje korzystające z dwóch w/w konstrukcji zapisu:</p>
<pre class="brush: php">function test_return($arg)
{
  if ($arg % 2 == 0)
  {
    return 0;
  }
  $arg = $arg*7+2;
  $a = $arg+3;
  $b = 1024;
  $arg = $a - $b*$arg;
  $arg =- 500;
  $arg *= 2;
  return $arg+256;
}</pre>
<p>&#8230;oraz:</p>
<pre class="brush: php">function test_else($arg)
{
  if ($arg % 2 == 0)
  {
    return 0;
  }
  else
  {
    $arg = $arg*7+2;
    $a = $arg+3;
    $b = 1024;
    $arg = $a - $b*$arg;
    $arg =- 500;
    $arg *= 2;
    return $arg+256;
  }
}</pre>
<p>Jak można zauważyć, funkcje te nie mają zbytniego sensu, nie mniej ich głównym celem jest odrzucanie liczb parzystych a przetwarzanie jedynie nieparzystych.</p>
<p>Procedura testowa polegała na wykonaniu jednego miliona iteracji każdej z funkcji, podając kolejne liczby całkowite jako argument poczynając od 0.</p>
<pre class="brush: php">for ($i = 0; $i &lt; 1000000; $i++)
{
  test_return($i);
}</pre>
<p>Wyniki jakie otrzymałem prezentują się następująco:</p>
<table>
<tbody>
<tr>
<th>Nazwa funkcji</th>
<th>Czas wykonania 1 000 000 iteracji</th>
</tr>
<tr>
<td>test_return()</td>
<td>~760ms</td>
</tr>
<tr>
<td>test_else()</td>
<td>~760ms</td>
</tr>
</tbody>
</table>
<p>Jak widać, wyniki są identyczne. W praktyce występowały pewne wahania w zależności od wywołania skryptu, nie mniej średnio, obie funkcje wykonują się w tym samym czasie. Nie ma więc znaczenia jakiego typu konstrukcji użyjemy &#8211; najlepiej tej która bardziej nam w danej chwili odpowiada.</p>
<p>Dlaczego tak się dzieje? Przyczyny braku różnicy w czasie wykonania można dopatrywać się tym, iż parser PHP bądź co bądź musi przeczytać całą zawartość skryptu przed jego kompilacją i uruchomieniem. Skompilowany kod jednej i drugiej funkcji nie różni się zatem niczym, co mogło by w istotny sposób wpłynąć na czas jego wykonania.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/03/if-else-czy-return/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

