2012-12-30 26 views
14

tôi đo thời gian thực hiện hai chức năng:JQuery grep (...) VS lọc tự nhiên JavaScript (...) thực hiện chức năng

  • jQuery grep chức năng
  • Native Javascript filter chức năng

Việc thực hiện các phương pháp sau đã được đo bằng công cụ Hồ sơ trên 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;      
    }); 
} 

Mảng words được tạo từ 1 triệu chuỗi được tạo ngẫu nhiên. Mỗi phương pháp được chạy 20 lần. Về sự ngạc nhiên của tôi jQuery chức năng grep nhanh hơn.

lần Execution (20 hành):

  • jQuery grep chức năng 26,31s
  • Native Javascript filter chức năng 34,66s

Bạn có thể repeate measurings trên jsFidle này - nó sẽ mất một thời gian để thực hiện vì vậy hãy kiên nhẫn.

Có giải thích tại sao chức năng jQuery grep nhanh hơn không native JavaScript filter hoạt động?

PS: Câu hỏi này được lấy cảm hứng từ số answer này.

+6

Tìm kiếm giải thích? Hãy thử xem [** việc triển khai grep **] (https://github.com/jquery/jquery/blob/master/src/core.js#L712).Để kiểm tra hiệu suất, hãy sử dụng [** JSPerf **] (http://jsperf.com/) thay vì tạo tập lệnh có thể đóng băng trình duyệt. – Joseph

+0

Tôi đặt nó vào [** một bộ thử nghiệm trong jsPerf **] (http://jsperf.com/filterings). Mặc dù vậy, tôi đã giảm nó xuống thành phần '100 000', thậm chí' 1 000' là tốt cho số – Alexander

+0

@JosephtheDreamer cảm ơn lời khuyên. – PrimosK

Trả lời

12

Bằng cách so sánh thực tế jQuery chức năng $.grep sử dụng trên trang

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 
} 

(kiểm tra here cho phi minified, nhờ Alexander) chống lại the algorithm định cho

Array.prototype.filter.

Có vẻ với tôi như .filter buộc nó this để Object, kiểm tra callback IsCallable và đặt this trong nó cũng như kiểm tra sự tồn tại của tài sản trong mỗi lần lặp, trong khi .grep giả và bỏ qua các bước này, có nghĩa là có hơi ít xảy ra.

Kết hợp điều này với trình biên dịch JavaScript tốt như thế nào trong Chrome và bạn có thể thấy sự khác biệt về tốc độ.

Thêm một số trong những thành $.grep sẽ làm cho nó trông giống như

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

và mất khoảng cùng thời điểm với .filter(modified Alexander's jsperf).

+2

Bạn có thể muốn xem [phiên bản không được rút gọn của '$ .grep'] (http://james.padolsey.com/jquery/#v=1.7.2&fn=jQuery.grep) mặc dù – Alexander

+1

@Alexander cảm ơn, Tôi đã liên kết điều đó và ghi nhận bạn (hai lần vì tôi đã sử dụng jsperf của bạn) –

+0

Ngoài ra: http://james.padolsey.com/jquery/#v=2.1.1&fn=jQuery.grep –

Các vấn đề liên quan