Mierzenie czasu wykonania skryptów JS

Czasem przydatna staje się wiedza o tym, które ze znanych rozwiązań jest szybsze. Oczywiście można polegać na teoretycznej wiedzy, podpierać się nawet złożonością algorytmów itd. itd. Często jednak starczy kilka prostych testów. Oto obiekt pozwalający w banalny sposób sprawdzić jak szybko wykonał się skrypt. Nazwałem go yProfiler.

Kod

[javascript]// obiekt yProfiler – zliczanie czasu wykonania skryptu
// autor: Patryk yarpo Jar
var yProfiler = function()
{
var nTimeStart = 0,
nTimeStop  = 0,
nLastDuration = -1,
oDate = null;

function fStart()
{
oDate = new Date();
nTimeStart = oDate.getTime();
return nTimeStart;
}
function fStop()
{
oDate = new Date();
nTimeStop = oDate.getTime();
nLastDuration = nTimeStop-nTimeStart;
return nLastDuration;
}
function fTime()
{
// nie wystartowano jeszcze :/
if (!nTimeStart)
{
return false;
}
// nie skonczono jeszcze
if (!nTimeStop)
{
fStop();
}
if (nLastDuration < 0 || isNaN(nLastDuration))
{
nLastDuration = nTimeStop – nTimeStart;
}
return nLastDuration;
}
function fGetStart()
{
return (nTimeStart) ? nTimeStart : false;
}
function fGetStop()
{
return (nTimeStop) ? nTimeStop : false;
}
function fLoop(func, n)
{
fStart();
for(i = 0; i < n; i++)
{
func();
}
fStop();
return nLastDuration;
}

// konstruktor:
fStart(); // domyslnie startuje
return {
start   : fStart,
stop    : fStop,
time    : fTime,
getStart: fGetStart,
getStop : fGetStop,
loop    : fLoop
};
};[/javascript]

W tym obiekcie można dostrzec właściwości private, o których więcej przeczytasz na stronie Douga Crockforda. Wykorzystałem tu także wzorzec modułowy do stworzenia obiektu (kiedyś opiszę kilka sposobow na produkcję obiektów) dzięki czemu nie trzeba, a nawet nie należy używać operatora new (przeczytaj dlaczego – blog YUI).

Zastosowanie

[javascript]var time = yProfiler();

function test1()
{
var n = 10000;
for(var i=0; i < n; i++)
{
var a = a+a;
}
}
time.start();
test1();
alert(time.stop());[/javascript]

Powyższy kod pozwala na wykorzystanie metody yProfiler.loop(). Przyjmuje ona dwa parametry – pierwszy to referencja na funkcję, która ma być wywołana, drugi – liczba wywołań tej funkcji (patrz prywatną metodę yProfiler.fLoop()). Na koniec wszystko jest wyświetlane za pomocą alertów. Jest jeszcze drugi sposób wywołania.

Zastosowanie 2

[javascript]var time = yProfiler();
var n = 10000;
alert(time.loop(function(i) { var a = i+i; } ), n);[/javascript]

Jeśli zajrzysz do środka tego obiektu to pierwsza metoda jest niejawnym wywołaniem drugiej. Przyjemnych testów wydajności. Pamiętaj, że nie można traktować wyników jako wyroczni. Wiele zależy od przeglądarki, sprzętu i innych czynników. Nie gwarantuję także, że obiekt ten jest wolny od błędów – używasz na swoją odpowiedzialność.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *