2012-12-30 63 views
14

予測量的這兩個函數的執行時間:JQuery的grep的(...)VS本地JavaScript濾波器(...)函數性能

  • jQuery的grep功能
  • 本地JavaScript filter功能

已使用Chrome配置文件工具測量了以下方法的執行情況:

// 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;      
    }); 
} 

words的數組由一百萬個隨機生成的字符串構成。每種方法運行20次。令我驚訝的是jQuery grep函數速度更快。

執行時間(20處決):

  • jQuery的grep功能26,31s
  • 本地JavaScript filter功能34,66s

您可以在此jsFidle repeate次測量 - 執行需要一些時間,所以要耐心等待。

是否有任何的解釋,爲什麼jQuery的grep功能是更快然後本地的JavaScript filter功能?

PS:此問題受此answer的啓發。

+6

尋找解釋?嘗試看看[** grep **的實現](https://github.com/jquery/jquery/blob/master/src/core.js#L712)。至於測試性能,請使用[** JSPerf **](http://jsperf.com/),而不是製作可凍結瀏覽器的腳本。 – Joseph

+0

我把它放到[** jsPerf **中的測試套件中](http://jsperf.com/filterings)。我把它減少到了10萬個元素,即使是'1000'也沒問題 – Alexander

+0

@JosephtheDreamer謝謝你的提示。 – PrimosK

回答

12

通過比較實際的jQuery函數$.grep使用頁面

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 
} 

上(檢查here非精縮,感謝Alexander)在針對

Array.prototype.filter指定the algorithm

它看起來對我來說,.filter迫使其this對象,檢查回調IsCallable,並在其中設置this以及檢查在每次迭代特性的存在,而.grep假設,並跳過這些步驟,意思是有繼續稍微少一點。

將此與Chrome中的JavaScript編譯器的優點結合起來,您可能會發現速度的不同。

添加一定量的這些成$.grep將使它看起來像

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; 
} 

,並採取大約在同一時間爲.filter(modified Alexander's jsperf)

+2

你可能想看看[$ .grep'](http://james.padolsey.com/jquery/#v=1.7.2&fn=jQuery.grep)的非縮小版本,儘管 – Alexander

+1

@亞歷山大謝謝,我已經鏈接並記入你(兩次因爲我也使用了你的jsperf) –

+0

另外:http://james.padolsey.com/jquery/#v=2.1.1&fn=jQuery.grep –