2012-12-19 32 views
7

Tìm cách để tối ưu hóa mã của tôi, tôi đã xảy ra khi this jsPerf test. Không mong đợi bất cứ điều gì khác hơn là để có khái niệm của tôi về sự chậm chạp của các cuộc gọi chức năng tái khẳng định, kết quả của tôi với IE 9 thực sự đã ném tôi cho một vòng lặp. Mã sử ​​dụng các cuộc gọi chức năng là nhanh hơn, nhưng chỉ trên trình duyệt này. Tôi chạy nó nhiều lần với cùng một kết quả. Tôi không thể thấy rằng bài kiểm tra đã được thiết lập không chính xác. Điều gì có thể gây ra kết quả kỳ lạ này?IE hoạt động nhanh hơn với các cuộc gọi chức năng?

user agent của tôi là Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0 chạy trên Windows Server 2008.

+0

Rất tiếc, IE 10 cũng không thực hiện điều đó. – vcsjones

+0

Chỉ cần xác nhận rằng nó chỉ là một điều IE 9. Thử lại trên máy tính khác. –

+1

Đã là quá trình xử lý tab 32 bit hay 64 bit? Đã bật hoặc tắt tính năng gỡ lỗi tập lệnh? Có sự khác biệt nào nếu bạn sử dụng kết quả * của bài kiểm tra (ví dụ như ngăn chặn tối ưu toàn bộ nội dung) – EricLaw

Trả lời

4

Disclaimer: Tôi là tác giả của jsPerf.com.


thử nghiệm đầu tiên của bạn là như sau:

var i = 0; 
for (i = 0; i < 1000; i++) { 
    test() 
} 

Tại sao bao gồm các for vòng lặp đó? Nó chỉ làm lệch kết quả. jsPerf tự động lặp lại mã kiểm tra cho đến khi nó thực hiện đủ các kiểm tra để đạt được kết quả có ý nghĩa thống kê. Lý tưởng nhất, các bài kiểm tra jsPerf càng nhỏ gọn càng tốt và chỉ kiểm tra những gì bạn thực sự muốn kiểm tra. Trong trường hợp này, bạn hoàn toàn không quan tâm đến hiệu suất vòng lặp for - bạn chỉ muốn tìm hiểu xem mã nội tuyến có nhanh hơn gọi hàm hay không.

Nếu bạn quan tâm đến các mẹo khác về tạo trường hợp kiểm tra jsPerf mạnh mẽ, check out my #jsconfeu2011 presentation.

Lưu ý: Tôi không nói vòng lặp thừa for là lý do tại sao bạn thấy kết quả này. Nó có thể là một yếu tố, nhưng có thể có một cái gì đó mà hơn nữa skews kết quả. This might be IE9’s “dead code removal” feature kicking in.

Dù sao, tôi đã chia nhánh bài kiểm tra jsPerf của bạn, xóa vòng lặp và thực hiện các biến toàn cầu nhằm tránh tối ưu hóa xóa mã chết. http://jsperf.com/function-calls-vs-inline/3 Bạn có thể kiểm tra điều này trong IE9 không? Hiện tại tôi không có máy ảo IE9.

+0

Tôi không có quyền truy cập vào máy tính của mình bằng IE9 ngay bây giờ, nhưng có lẽ thậm chí còn kỳ lạ hơn, Chrome hiện đang hoạt động nhanh hơn với các cuộc gọi chức năng. –

+0

@TreyKeown: Thú vị, tôi có thể tạo lại kết quả trong Chrome 28, nhưng không thể trong Chrome 30 Canary. Nó có thể đã là một fluke trong phiên bản v8 được vận chuyển với Chrome 28. Một cái gì đó tương tự đã xảy ra trong khi trở lại - tại một số điểm, thực hiện tìm kiếm phạm vi nhanh hơn _not_ thực hiện tìm kiếm phạm vi trong v8: http://jsperf.com/ phạm vi tra cứu –

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