5 - Hạn chế gọi hàm trong vòng lặp
Đây là điều dĩ nhiên không chỉ dành cho jQuery mà dành cho tất cả mọi ngôn ngữ lập trình. Nếu có một cách khác thay thế tốt hơn, chúng ta nên dùng vì việc gọi hàm trong vòng lặp sẽ làm chậm rất đáng kể và tốn tài nguyên khá nhiều. Ví dụ ta có đoạn code như bên dưới:var items = [....]; // Giả sử có 100 phần tử var list = $('#list'); // Giả sử là đối tượng <select> for(var i = 0; i < items.length; i++) { list.append($('<option />').attr('value', items[i]).html(i)); }
Ở đoạn code này, chúng ta gọi tới 3 hàm trong vòng lặp. điều này hạn chế rất nhiều về mặt tốc độ. Chúng ta có thể thay thế bằng đoạn code sau:
var items = [....]; // Giả sử có 100 phần tử var list = $('#list'); // Giả sử là đối tượng <select> var str = ''; for(var i = 0; i < items.length; i++) { str += '<option value="'+i+'">'+items[i]+'</option>'; } list.html(str);
6 - Nếu số phần tử trong mảng lớn, thay thế phép nối chuỗi bằng join() các phần tử.
Đoạn code trên, chúng ta có thể cải tiến thêm tí nữa để tăng tốc nhanh hơn. Nhưng nếu số lượng phấn tử không quá lớn thì tốc độ giữa tip 5 và tip 6 không cách xa nhau bao nhiêu. (Tính bằng ms nên cũng không có gì đáng ngại lắm ^^)var items = [....]; // Giả sử có 1000 phần tử var list = $('#list'); // Giả sử là đối tượng <select> var temp = []; for(var i = 0; i < items.length; i++) { temp[i] = '<option value="'+i+'">'+items[i]+'</option>'; } list.html(temp.join(''));
7 - Hàm for nhanh hơn $.each nhưng vẫn cứ xài $.each
Trong jquery cung cấp cho chúng ta một helper $.each giúp chúng ta thực hiện vòng lặp. Helper này chậm hơn so với hàm for (hàm built-in của javascript) nhưng đây là trường hợp ngoại lệ mình khuyên các bạn nên dùng $.each thay vì dùng for. Chắc chắn các bạn sẽ có sự thắc mắc tại đây, chúng ta cùng xem sự so sánh bên dưới để hiểu rõ vì sao mình khuyên như vậy.console.time('TestNative'); var length = myArray.length; for( i=0; i < length; i++){ myArray[i]; } console.timeEnd('TestNative'); console.time('TestjQuery'); jQuery.each(myArray, function(i, val) { val; }); console.timeEnd('TestjQuery');
Và dưới đây là kết quả test
FOR loop Array size Time ========== ====== 10,000 7ms 100,000 62ms 1,000,000 613ms jQuery .each() loop Array size Time ========== ====== 10,000 10ms 100,000 177ms 1,000,000 1100ms
Số lượng phần tử trong mảng lên tới 10.000 chỉ cách biệt nhau 3ms. Và mình chắc chắn một mảng thông thường của javascript khó có thể đạt ngưỡng 10.000 phần tử, nên sự chênh lệch này gần như không có. Vậy chúng ta cứ an tâm mà dùng $.each
jQuery Performance Tips - Part 1
Optimize front-end to improve performance - Part 4
Optimize front-end to improve performance - Part 3
Optimize front-end to improve performance - Part 2
Optimize front-end to improve performance - Part 1
No comments:
Post a Comment