2009-04-13 29 views
5

Vì tôi sử dụng jQuery 1.3+ tất cả ngoại trừ một kiểm tra theo thời gian đang sử dụng điều đó. Khác là javascript đơn giản tôi tìm thấy từ trở lại vào năm 2000. Tôi ngừng đi tuyến đường đó như nó đã được khoảng 150 giây để chạy thử nghiệm. Tôi đã đọc khá nhiều trang web tối ưu hóa jQuery có liên quan đến việc chọn một phần tử đơn lẻ. '#id' là trường hợp tốt nhất để sử dụng, nhưng bây giờ tôi có vấn đề về số kiểm tra tất cả các hộp kiểm trong một cột trong một bảng khá lớn có nhiều cột hộp kiểm.Cách nhanh nhất để chọn một số lượng lớn hộp kiểm và chọn/chọn chúng là gì?

Điều tôi đã làm là thiết lập trang tạo 20.000 hàng bảng với hai cột hộp kiểm. Mục tiêu là để kiểm tra cột thứ hai xem mất bao lâu rồi bỏ chọn chúng và xem mất bao lâu. Rõ ràng chúng tôi muốn thời gian thấp nhất. Tôi chỉ sử dụng IE6 và 7 và trong trường hợp của tôi tất cả người dùng của tôi sẽ làm như vậy.

20.000 hàng bạn nói? Đó là những gì tôi đã nói, nhưng điều này sẽ được sản xuất (ngoài tầm tay của tôi) và đã quá muộn để thay đổi. Tôi chỉ cố gắng ném một cơn mưa đá với một giây còn lại trên đồng hồ. Bên cạnh đó, tôi đã học được rằng input.chkbox không phải là bộ chọn nhanh nhất (cho IE7)! :)

Câu hỏi đặt ra là, có cách nào tốt hơn để làm jQuery này hay không? Tôi muốn nó được chạy trong vòng chưa đầy nửa giây trên máy của tôi.

Vì vậy, bạn không cần phải nhập lại tất cả các crap tôi đã thực hiện ở đây là các công cụ kiểm tra tôi đã đưa ra:

Cập nhật Morning 4/14 để bao gồm thêm các thử nghiệm thời gian:

<form id="form1" runat="server"> 
<div>   
     <a href="#" id="one">input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="two">#myTable tr[id^='row'] input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="three">#myTable tr.myRow input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="four">tr.myRow input[id^='chkbox'][type='checkbox']</a><br /> 
     <a href="#" id="five">input[id^='chkbox']</a><br /> 
     <a href="#" id="six">.chkbox</a><br /> 
     <a href="#" id="seven">input.chkbox</a><br /> 
     <a href="#" id="eight">#myTable input.chkbox</a><br /> 

     <a href="#" id="nine">"input.chkbox", "tr"</a><br /> 
     <a href="#" id="nine1">"input.chkbox", "tr.myRow"</a><br /> 
     <a href="#" id="nine2">"input.chkbox", "#form1"</a><br /> 
     <a href="#" id="nine3">"input.chkbox", "#myTable"</a><br /> 

     <a href="#" id="ten">input[name=chkbox]</a><br /> 
     <a href="#" id="ten1">"input[name=chkbox]", "tr.myRow"</a><br /> 
     <a href="#" id="ten2">"input[name=chkbox]", "#form1"</a><br /> 
     <a href="#" id="ten3">"input[name=chkbox]", "#myTable"</a><br /> 

     <a href="#" id="ten4">"input[name=chkbox]", $("#form1")</a><br /> 
     <a href="#" id="ten5">"input[name=chkbox]", $("#myTable")</a><br /> 

     <a href="#" id="eleven">input[name='chkbox']:checkbox</a><br /> 
     <a href="#" id="twelve">:checkbox</a><br /> 
     <a href="#" id="twelve1">input:checkbox</a><br /> 
     <a href="#" id="thirteen">input[type=checkbox]</a><br /> 

     <div> 
      <input type="text" id="goBox" /> <button id="go">Go!</button> 
      <div id="goBoxTook"></div> 
     </div> 

     <table id="myTable"> 
      <tr id="headerRow"><th>Row #</th><th>Checkboxes o' fun!</th><th>Don't check these!</th></tr> 
      <% for(int i = 0; i < 20000;i++) { %> 
      <tr id="row<%= i %>" class="myRow"> 
       <td><%= i %> Row</td> 
       <td> 
        <input type="checkbox" id="chkbox<%= i %>" name="chkbox" class="chkbox" /> 
       </td> 
       <td> 
        <input type="checkbox" id="otherBox<%= i %>" name="otherBox" class="otherBox" /> 
       </td> 
      </tr> 
      <% } %> 
     </table> 
</div> 
     <script type="text/javascript" src="<%= ResolveUrl("~/") %>Javascript/jquery.1.3.1.min.js"></script> 
     <script type="text/javascript"> 

      $(function() {     
       function run(selectorText, el) {      
        var start = new Date();      
        $(selectorText).attr("checked", true);        
        var end = new Date(); 
        var timeElapsed = end-start; 
        $(el).after("<br />Checking Took " + timeElapsed + "ms"); 

        start = new Date();      
        $(selectorText).attr("checked", false);        
        end = new Date(); 
        timeElapsed = end-start; 
        $(el).after("<br />Unchecking Took " + timeElapsed + "ms"); 
       }  

       function runWithContext(selectorText, context, el) {      
        var start = new Date();      
        $(selectorText, context).attr("checked", true);        
        var end = new Date(); 
        var timeElapsed = end-start; 
        $(el).after("<br />Checking Took " + timeElapsed + "ms"); 

        start = new Date();      
        $(selectorText, context).attr("checked", false);         
        end = new Date(); 
        timeElapsed = end-start; 
        $(el).after("<br />Unchecking Took " + timeElapsed + "ms"); 
       } 

       $("#one").click(function() {       
        run("input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#two").click(function() { 
        run("#myTable tr[id^='row'] input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#three").click(function() { 
        run("#myTable tr.myRow input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#four").click(function() { 
        run("tr.myRow input[id^='chkbox'][type='checkbox']", this); 
       }); 

       $("#five").click(function() { 
        run("input[id^='chkbox']", this); 
       }); 

       $("#six").click(function() { 
        run(".chkbox", this); 
       }); 

       $("#seven").click(function() { 
        run("input.chkbox", this); 
       }); 

       $("#eight").click(function() { 
        run("#myTable input.chkbox", this); 
       }); 

       $("#nine").click(function() { 
        runWithContext("input.chkbox", "tr", this); 
       }); 


       $("#nine1").click(function() { 
        runWithContext("input.chkbox", "tr.myRow", this); 
       }); 
       $("#nine2").click(function() { 
        runWithContext("input.chkbox", "#form1", this); 
       }); 
       $("#nine3").click(function() { 
        runWithContext("input.chkbox", "#myTable", this); 
       }); 

       $("#ten").click(function() { 
        run("input[name=chkbox]", this); 
       });     

       $("#ten1").click(function() { 
        runWithContext("input[name=chkbox]", "tr.myRow", this); 
       }); 

       $("#ten2").click(function() { 
        runWithContext("input[name=chkbox]", "#form1", this); 
       }); 

       $("#ten3").click(function() { 
        runWithContext("input[name=chkbox]", "#myTable", this); 
       }); 

       $("#ten4").click(function() { 
        runWithContext("input[name=chkbox]", $("#form1"), this); 
       }); 

       $("#ten5").click(function() { 
        runWithContext("input[name=chkbox]", $("#myTable"), this); 
       }); 

       $("#eleven").click(function() { 
        run("input[name='chkbox']:checkbox", this); 
       }); 

       $("#twelve").click(function() { 
        run(":checkbox", this); 
       }); 

       $("#twelve1").click(function() { 
        run("input:checkbox", this); 
       }); 

       $("#thirteen").click(function() { 
        run("input[type=checkbox]", this); 
       }); 

       $('#go').click(function() { 
        run($('#goBox').val(), this); 
       }); 
      }); 
     </script> 
</form> 
+0

Tôi không có ý là vô ích, nhưng 20 nghìn hàng trong một trang chỉ là thiết kế tồi. Bạn nên khắc phục điều đó. :) –

+0

Chà ... không đùa đâu. :) Tôi đã không làm điều đó! Ngay bây giờ không có đủ thời gian để sửa nó cho bản phát hành này. Đây sẽ là điều đầu tiên cần làm trong lần phát hành tiếp theo. Dự án này đã mang lại nhiều thách thức "thú vị" cho đến nay. – rball

Trả lời

8

đầu vào [name = chkbox] là bộ chọn jQuery nhanh nhất trên máy của tôi trong IE7.

Unchecking Took 2453ms 
Checking Took 2438ms 
Unchecking Took 2438ms 
Checking Took 2437ms 
Unchecking Took 2453ms 
Checking Took 2438ms 

input.chkbox và ...

Unchecking Took 2813ms 
Checking Took 2797ms 
Unchecking Took 2797ms 
Checking Took 2797ms 
Unchecking Took 2813ms 
Checking Took 2797ms 

đầu vào: checkbox.chkbox dường như gắn liền với

Unchecking Took 2797ms 
Checking Took 2797ms 
Unchecking Took 2813ms 
Checking Took 2781ms 

.chkbox gần như mất gấp đôi thời gian như input.chkbox

Unchecking Took 4031ms 
Checking Took 4062ms 
Unchecking Took 4031ms 
Checking Took 4062ms 

Các javascript cho vòng lặp đến nay là tồi tệ nhất sắp tới trong lúc:

Checking Took 149797ms 

150 giây! Nó cũng khóa trình duyệt. Điều này chỉ khiến tôi thực sự ấn tượng với jQuery. Tôi thành thật không mong đợi nó chậm. Có lẽ vì tôi đang đi qua từng yếu tố cá nhân mà sau đó nó phải tìm ...

này khá thú vị với tôi cũng như:

đầu vào [id^= 'chkbox']

Unchecking Took 3031ms 
Checking Took 3016ms 

mất ít thời gian hơn:

đầu vào [id^= 'chkbox'] [type = 'checkbox']

Unchecking Took 3375ms 
Checking Took 3344ms 

Tôi nghĩ vì tôi đã đăng nhiều bộ lọc hơn nên nhanh hơn. Không!

Xác định thậm chí nhiều con đường để hộp kiểm làm cho nó theo cách chậm:

#myTable tr [id^= 'hàng'] vào [id^= 'chkbox'] [type = 'hộp kiểm']

Checking Took 10422ms 

Nó thậm chí không chạy bỏ chọn thứ hai vì nó hỏi tôi nếu tôi muốn tiếp tục chạy tập lệnh trên máy tính của mình. Khùng! : P

Cập nhật Morning 4/14:

Có người lớn lên lập bối cảnh: Tôi thực sự đã làm một vài trong số những người và nhiều điều để ngạc nhiên của tôi và chống lại những gì rất nhiều người đã nói trên web trên IE7 đây là những chậm hơn! Dưới đây là thời gian tôi nhận với quy định kết hợp với bộ chọn nhanh hơn của trên một vài bối cảnh khác nhau của: tr

"input.chkbox", "tr"

Checking Took 8546ms 

"input.chkbox"," .myRow"

Checking Took 8875ms 

"input.chkbox", "# Form1"

Unchecking Took 3032ms 
Checking Took 3000ms 

"input.chkbox", "#myTable"

Unchecking Took 2906ms 
Checking Took 2875ms 

chiến thắng hiện tại (vẫn): đầu vào [name = chkbox]

Unchecking Took 2469ms 
Checking Took 2453ms 

"đầu vào [tên = chkbox] "," tr.myRow"

Checking Took 9547ms 

"đầu vào [name = chkbox]", "# Form1"

Unchecking Took 3140ms 
Checking Took 3141ms 

"đầu vào [name = chkbox]", "#myTable"

Unchecking Took 2985ms 
Checking Took 2969ms 

Cập nhật 2 Sáng 4/14

Nghĩ rằng tôi có thể đã có kết quả tốt hơn sau khi tôi nhận thấy sự khác biệt cú pháp từ http://beardscratchers.com/journal/jquery-its-all-about-context. Dường như chúng KHÔNG giống như chúng cho thời gian tốt hơn một chút, nhưng vẫn không đánh bại bộ chọn không theo ngữ cảnh - darn.

"đầu vào [name = chkbox]", $ ("# Form1")

Unchecking Took 3078ms 
Checking Took 3000ms 
Unchecking Took 3078ms 
Checking Took 3016ms 

"đầu vào [name = chkbox]", $ ("# myTable")

Unchecking Took 2938ms 
Checking Took 2906ms 
Unchecking Took 2938ms 
Checking Took 2921ms 

cập nhật 3 Morning 4/14

Russ muốn tôi thử các ra, họ de/chọn tất cả các bo XES nhưng một lần nữa nó là thú vị:

: hộp kiểm

Unchecking Took 8328ms 
Checking Took 6250ms 

đầu vào: hộp kiểm

Unchecking Took 5016ms 
Checking Took 5000ms 

-> nhanh nhất?!?! đầu vào [type = checkbox]

Unchecking Took 4969ms 
Checking Took 4938ms 

Thực tế là thứ ba lên đó là nhanh nhất là khá thú vị như đi ngược lại những gì tôi đã có thể nghĩ. Tại sao không (đối với IE7 ít nhất): hộp kiểm chỉ sử dụng hộp kiểm loại = để đạt được thời gian nhanh hơn? Đây là điểm số thực sự gần nhưng việc kiểm tra mất 62ms ít thời gian hơn. Ngoài ra, tại sao hai khác nhau đầu tiên? Có yếu tố nào khác ngoài đầu vào có thể có hộp kiểm không?

+0

Các tiêu chí lựa chọn khác không tăng tốc độ truy vấn trừ khi mỗi tiêu chí giảm kích thước đã đặt. Vì tất cả các hộp kiểm đều nằm trong các hàng trong bảng và có đầu vào, việc thêm các hộp kiểm này làm tiêu chí không giúp ích gì. –

+0

"Tôi nghĩ vì tôi đã đăng nhiều bộ lọc hơn nên nhanh hơn." như Zan đã nói, nhiều bộ lọc hơn = nhiều lần kiểm tra = nhiều lần xử lý = nhiều thời gian hơn. Trừ khi mỗi bộ lọc giảm đáng kể kích thước thiết lập cho bộ lọc tiếp theo, nó chỉ chiếm các chu kỳ. – nickf

5

Tôi chưa thử nghiệm điều này, nhưng bạn có thể thử xây dựng một mảng [] tham chiếu hộp kiểm trên tải trang sau đó chỉ cần lặp lại mỗi lần bạn muốn thực hiện thay đổi?

Bạn sẽ trả chi phí hiệu suất khi tải trang, nhưng nó có thể nhanh hơn đi bộ DOM mỗi lần. Hey, ít nhất bạn sẽ thực hiện việc nâng hạng nặng trong thời gian xuống của người dùng (mất bao lâu để mọi người định vị và nhấp vào tùy chọn bỏ chọn/chọn).

+0

Hoặc tôi tự hỏi nếu bạn có thể "lưu chúng" vào một mảng lần đầu tiên (hoặc lúc tải), và sau đó nó sẽ nhanh hơn khi chúng đánh lại nó. Ý tưởng tuyệt vời, tôi sẽ cho nó đi. – rball

+0

cho tôi biết cách bạn tham gia! – Codebrain

+0

Sẽ làm, nhưng có thể là ngày mai, vì ngày làm việc gần như đã kết thúc. – rball

2

Đề xuất duy nhất của tôi có thể không hoạt động. Chuyển đổi trình duyệt. Nhưng tôi chỉ có một công ty thực sự đồng ý với điều đó. Chúng tôi đã chuyển công ty thành FireFox và người dùng cụ thể chuyển sang Google Chrome. IE chỉ là quá chậm với JavaScript.

Ngoài ra, bạn có thể thử đặt trước bộ nhớ cache danh sách truy vấn jquery.

Nếu vẫn thất bại, hãy giải quyết nó bằng tâm lý học. Điều đó có nghĩa là cho phép người dùng biết rằng có điều gì đó sẽ mất nhiều thời gian. Đặt một div "Vui lòng chờ" trong khi chức năng đang hoạt động. Bằng cách đó, người dùng biết rằng trình duyệt không chỉ bị khóa và họ biết khi nào họ có thể quay lại làm việc. Tôi đã có một trang chậm "giải quyết" bằng cách làm điều này.

+0

Lol, vâng, sẽ không xảy ra. Tôi "may mắn" đủ để có thể sử dụng IE7. Mọi người khác được yêu cầu sử dụng IE6. Tôi sẽ xem xét trước khi lưu vào bộ nhớ cache. – rball

+0

Một tùy chọn khác ... Bạn đang sử dụng thao tác thuộc tính JQuery cho cài đặt được chọn: $ (selectorText) .attr ("checked", false); Bạn cũng có thể thử $ (selectorText) .each (function() {this.checked = false}); Không đảm bảo nhưng có thể đáng để chụp. –

+0

Nghĩ về việc đó. Tôi sẽ thử xem điều gì xảy ra. Chúng tôi đang thực sự đưa ra một thông báo xin vui lòng chờ đợi, trước khi nó được 150 giây, nhưng nhận được nó xuống 2-3 sẽ là tuyệt vời. – rball

1

Bạn đã thử bộ chọn jQuery với một context để xem điều đó có cải thiện hiệu suất không? Có lẽ các điều khiển sẽ được bên trong một hình thức ASP.NET, và có lẽ một yếu tố nhận dạng duy nhất?

Ví dụ, nếu bạn có

$("input[id^='chkbox']") 

Hãy thử với

$("input[id^='chkbox']", "#myFormID") 

Here's a BeardScratchers article trên bối cảnh

EDIT:

Tiếp theo cập nhật của bạn, nó có vẻ như 2.45- 6 giây có thể là nhanh nhất mà bạn có thể đạt được, với hoàn cảnh của bạn.

Chỉ để hoàn thành, bạn đã thử các bộ chọn sau chưa?

$(':checkbox') 
$('input[type=checkbox]') 
+0

Dường như chậm hơn. Có lẽ tôi chưa nhận được bối cảnh "đúng" mặc dù ... – rball

+0

Cập nhật bài đăng với kết quả. – rball

+0

Chờ ... đọc toàn bộ bài viết, có vẻ như tôi đã cung cấp ngữ cảnh sai? – rball

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