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
// 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
};
};
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
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());
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
var time = yProfiler();
var n = 10000;
alert(time.loop(function(i) { var a = i+i; } ), n);
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ść.