<?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; sqrt</title>
	<atom:link href="http://www.bbproject.net/tag/sqrt/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>Optymalizacja działań matematycznych w Delphi</title>
		<link>http://www.bbproject.net/2010/06/optymalizacja-dzialan-matematycznych-w-delphi/</link>
		<comments>http://www.bbproject.net/2010/06/optymalizacja-dzialan-matematycznych-w-delphi/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 05:29:36 +0000</pubDate>
		<dc:creator>M@ster</dc:creator>
				<category><![CDATA[Programowanie]]></category>
		<category><![CDATA[delphi]]></category>
		<category><![CDATA[optymalizacja]]></category>
		<category><![CDATA[potęgowanie]]></category>
		<category><![CDATA[power]]></category>
		<category><![CDATA[sqr]]></category>
		<category><![CDATA[sqrt]]></category>

		<guid isPermaLink="false">http://www.bbproject.net/?p=353</guid>
		<description><![CDATA[Mnożenie, potęgowanie, pierwiastkowanie, wszystkie te operacje trwają ułamek sekundy na obecnych maszynach, ułamek sekundy do czasu gdy nie musimy wykonać tysięcy czy miliony iteracji danego działania. W takiej sytuacji odpowiedni dobór użytych funkcji może mieć duży wpływ na czas trwania całej operacji. W tym wpisie pokaże jakich błędów unikać pisząc w Delphi skomplikowane działania, aby [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-thumbnail wp-image-354 alignleft" title="Sqrt" src="http://www.bbproject.net/wp-content/uploads/2010/05/sqrt-160x87.png" alt="" width="160" height="87" />Mnożenie, potęgowanie, pierwiastkowanie, wszystkie te operacje trwają ułamek sekundy na obecnych maszynach, ułamek sekundy do czasu gdy nie musimy wykonać tysięcy czy miliony iteracji danego działania. W takiej sytuacji odpowiedni dobór użytych funkcji może mieć duży wpływ na czas trwania całej operacji.</p>
<p>W tym wpisie pokaże jakich błędów unikać pisząc w Delphi skomplikowane działania, aby nie marnować czasu użytkownika końcowego naszej aplikacji. Do dzieła!</p>
<p><span id="more-353"></span></p>
<h4>Stałe</h4>
<p>Zacznijmy od rzeczy najprostszej, wykluczania operacji których wynik jest zawsze taki sam. Głupota? Prosty przykład, obliczenia w których występuje liczba PI podniesiona do kwadratu. Wartość tego wyrażenia jest zawsze taka sama, gdyż PI wynosi zawsze tyle samo.</p>
<pre class="brush: delphi">procedure TForm1.Button1Click(Sender: TObject);
var
  k: Double;
begin
  k := GetTickCount * Sqr(PI) + 4;
end;</pre>
<p>W takiej sytuacji zamiast podnosić 3,14 za każdym razem do kwadratu, najlepiej wyliczyć sobie tą wartość chociażby na systemowym kalkulatorze i zadeklarować nową stałą. Rzecz jasna, jak wcześniej wspomniałem, ma to sens tylko gdy wykonujemy naprawdę dużo obliczeń &#8211; inaczej jest to sztuka dla sztuki.</p>
<pre class="brush: delphi">procedure TForm1.Button1Click(Sender: TObject);
const
  PI_2 = 9.8696044010893586188344909998762;
var
  k: Double;
begin
  k := GetTickCount * PI_2 + 4;
end;
</pre>
<h4>Unikanie dzielenia</h4>
<p>Swego czasu, wyczytałem iż lepiej jest przykładowo mnożyć razy 0,5 niż dzielić przez 2. Próbowałem potwierdzić to różnymi testami, ale za każdym razem dostawałem identyczny wynik. Strzelam że obecne procesory lepiej sobie radzą z dzieleniem w stosunku do mnożenia liczb zmiennoprzecinkowych niż kiedyś.</p>
<p>Dlatego też porada ta nie ma dzisiaj większego sensu, ale warto o niej pamiętać.</p>
<h4>Power, Sqr, Sqrt</h4>
<p>Funkcja <em>Power</em>, analogicznie do swojej nazwy kryje w sobie dużą moc <img src='http://www.bbproject.net/wp-includes/images/smilies/icon_wink.png' alt=';)' class='wp-smiley' /> , nie mniej, należy się jej wystrzegać jak ognia. <em>Power</em> przyjmuje 2 argumenty, pierwszym jest liczba którą chcemy podnieść do potęgi, a drugim wykładnik potęgi.</p>
<p>Daje to ogromne możliwości z uwagi na fakt iż jest to liczba zmiennoprzecinkowa. Nie mniej, w sytuacji w której podnosimy liczbę do potęgi drugiej, bądź wyciągamy pierwiastek stopnia drugiego bezwzględnie stosujmy funkcje <em>Sqr</em> oraz <em>Sqrt</em>. Pierwiastek 4 stopnia? Zagnieżdżone dwie funkcję <em>Sqrt</em> będą na pewno szybsze niż jeden <em>Power</em>.</p>
<p>Oto małe porównanie szybkości wykonywania się poszczególnych operacji:</p>
<table>
<tbody>
<tr>
<th>Funkcja</th>
<th>Czas wykonania</th>
</tr>
<tr>
<td>Sqr(x)</td>
<td>0,0547ms</td>
</tr>
<tr>
<td>Sqrt(x)</td>
<td>0,6396ms</td>
</tr>
<tr>
<td>Power(x, 2)</td>
<td>0,8642ms</td>
</tr>
<tr>
<td>Power(x, 0.5)</td>
<td>3,9702ms</td>
</tr>
</tbody>
</table>
<p>I na koniec wynik testu z pierwiastkiem czwartego stopnia:</p>
<table>
<tbody>
<tr>
<th>Funkcja</th>
<th>Czas wykonania</th>
</tr>
<tr>
<td>Sqrt(Sqrt(x))</td>
<td>1,7472ms</td>
</tr>
<tr>
<td>Power(x, 0.25)</td>
<td>4,5896ms</td>
</tr>
</tbody>
</table>
<h4>Podsumowanie</h4>
<p>Liczę że te kilka porad pozwoli Wam na optymalizację wielokrotnie wykonywanych działań matematycznych w Delphi. Oczywiście należy też pamiętać o doprowadzeniu danego równania do jak najprostszej postaci przed przystąpieniem do implementacji w programie.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bbproject.net/2010/06/optymalizacja-dzialan-matematycznych-w-delphi/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

