Blog webdeveloperski Patryk yarpo Jar

Mierzenie czasu wykonania skryptów JS

Autor wiadomości Luty 17, 2011

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ść.

Komentarze (0) Trackbacks (0)

Brak komentarzy.


Leave a comment

 

Brak trackbacków.