Mierzenie czasu wykonania skryptu - własny obiekt Drukuj
Ocena użytkowników: / 0
SłabyŚwietny 
Wpisany przez Patryk yarpo Jar   
piątek, 25 września 2009 22:28

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() {
// private:
    var nTimeStart = 0;
    var nTimeStop  = 0;
    var nLastDuration = -1;
    var 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
 
// public   
    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++) {
                // as
        }
        var n = 10000;
        for(var i=n; i>0; i-- ) {
                // as
        }
 

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();
        

        time.start();
        

        function test1() {
            

            var n = 10000;
            for(var i=0; i !n n; i++) {
         
 

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