2012-12-30 17 views
14

I zmierzył czas wykonania tych dwóch funkcji:JQuery grep (...) VS rodzimej filtrem JavaScript (...) wykonywanie funkcji

  • jQuery grep funkcja
  • Język JavaScript filter funkcja

wykonanie następujących metod została zmierzona za pomocą przyrządu profili Chrome.BROWSER_UPGRADE_END_LINK

// jQuery GREP function 
function alternative1(words, wordToTest) { 
    return $.grep(words, function(word) { 
    return wordToTest.indexOf(word) != -1;      
    }); 
} 

// Native javascript FILTER function   
function alternative2(words, wordToTest) { 
    return words.filter(function(word) { 
    return wordToTest.indexOf(word) != -1;      
    }); 
} 

Tablica z words została zbudowana z 1 miliona losowo wygenerowanych ciągów. Każda metoda została uruchomiona 20 razy. Zaskakujące, że funkcja grep była szybsza.

razy Execution (20 egzekucje):

  • jQuery grep funkcyjne 26,31s
  • Język JavaScript filter funkcja 34,66s

Można repeate Pomiary na ten jsFidle - wykonanie zabierze trochę czasu, więc bądź cierpliwy.

Czy istnieją jakieś wyjaśnienie, dlaczego jQuery grep funkcja jest szybszy następnie rodzimej JavaScript filter funkcji?

PS: To pytanie zostało zainspirowane tym answer.

+6

Szukasz wyjaśnienia? Spróbuj rzucić okiem na [** implementację grep **] (https://github.com/jquery/jquery/blob/master/src/core.js#L712).Jeśli chodzi o testowanie wydajności, użyj [** JSPerf **] (http://jsperf.com/) zamiast tworzyć skrypt, który może zablokować przeglądarkę. – Joseph

+0

Umieściłem go w [** zestawie testów w jsPerf **] (http://jsperf.com/filterings). Zredużyłem go do elementów "100 000", ale nawet "1000" jest w porządku. – Alexander

+0

@JosephtheDreamer dzięki za wskazówki. – PrimosK

Odpowiedz

12

Porównując rzeczywistą funkcję jQuery $.grep używa na stronie

function (a, b, c) { 
    var d = [], 
     e; 
    c = !! c; 
    for (var f = 0, g = a.length; f < g; f++) e = !! b(a[f], f), c !== e && d.push(a[f]); 
    return d 
} 

(sprawdź here dla non-minified dzięki Alexander) przeciwko the algorithm określonej dla

Array.prototype.filter.

To mi wygląda .filter wymusza jego this do Object, sprawdza zwrotnego IsCallable i ustawia this w niej, jak również sprawdzanie istnienia własności w każdej iteracji, natomiast .grep zakłada i pomija te kroki, co oznacza, że nieco mniej się dzieje.

Połączyć to z dobrym kompilatorem JavaScript w przeglądarce Chrome i różnicą prędkości.

Dodanie niektórych z nich do $.grep by upozorować

function (elems, callback, inv, thisArg) { 
    var ret = [], 
     retVal; 
    inv = !!inv; 
    for (var i = 0, length = elems.length; i < length; i++) { 
     if (i in elems) { // check existance 
      retVal = !!callback.call(thisArg, elems[i], i); // set callback this 
      if (inv !== retVal) { 
       ret.push(elems[i]); 
      } 
     } 
    } 
    return ret; 
} 

i podjąć w tym samym czasie co .filter(modified Alexander's jsperf).

+2

Możesz zajrzeć do [nieminified wersji '$ .grep'] (http://james.padolsey.com/jquery/#v=1.7.2&fn=jQuery.grep), ale dzięki – Alexander

+1

@Alexander dzięki, Włączyłem to i zapisałem (dwa razy, ponieważ użyłem twojego jsperf). –

+0

Również: http://james.padolsey.com/jquery/#v=2.1.1&fn=jQuery.grep –

Powiązane problemy