JQuery grep(…)VS本机JavaScriptfilter(…)函数性能

我测量了这两个函数的执行时间:

  • jQuery grep函数
  • 原生JavaScript 过滤function

使用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数组由100万个随机生成的字符串构成。 每种方法运行20次。 令我惊讶的是, jQuery grep函数更快。

执行时间(20次执行):

  • jQuery grep函数26,31s
  • 原生JavaScript 过滤function34,66s

你可以在这个jsFidle上重复测量 – 执行需要一些时间,所以请耐心等待。

有没有解释为什么jQuery grep函数比原生 JavaScript filterfunction更快?

PS:这个问题的灵感来自于这个答案 。

通过比较$.grep在页面上使用的实际jQuery函数

 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 } 

(请查看此处针对非缩小,感谢Alexander )针对指定的算法

Array.prototype.filter

它看起来像.filter强制它的this 对象 ,检查回调IsCallable并在其中设置它以及检查每次迭代中是否存在属性,而.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 (修改后的亚历山大的jsperf) .filter相同。