2012-09-14 23 views
7

Chỉ có câu hỏi nhanh. Tôi tạo ra điểm chuẩn (liên kết bên dưới), và đối với tôi ít nhất (chạy chrome 18.0.1025), đọc các giá trị từ phía trước của mảng bằng cách sử dụng mảng.shift() mỗi lần có vẻ nhanh hơn đáng kể so với đọc các giá trị bằng cách sử dụng while/for lặp lại và truy cập chúng theo chỉ mục.Javascript: Tại sao điểm chuẩn này hiển thị mảng.shift() nhanh hơn mảng [i] khi đọc các giá trị từ một mảng?

Tôi chắc chắn điều này không thể đúng, vì shift() có nhiều việc phải làm hơn, nhưng đồng thời tôi không thể thấy những gì tôi có thể làm sai khi tính đến sự khác biệt cực đoan này?

http://jsperf.com/some-array-reading-comparisons

Cảm ơn bạn đã đọc, James

Trả lời

7

Bạn đang thiết lập mảng của bạn chỉ một lần mỗi thử nghiệm, và do đó chỉ có phiên đầu tiên của thử nghiệm shift có bất kỳ dữ liệu để làm việc với. Các lần lặp tiếp theo có một mảng trống còn lại từ lần lặp đầu tiên và kết thúc ngay lập tức.

Here is the fixed test suite, nơi thuật toán đột biến hoạt động trên bản sao dữ liệu. Thuật toán shift được dự đoán sẽ xuất hiện cuối cùng trong hiệu suất.

+1

Để công bằng, bạn cũng cần sao chép mảng cho những người sử dụng chỉ mục. – kennytm

+0

Đúng. Bộ kiểm tra được cập nhật, 'shift' vẫn xếp hạng cuối cùng. – lanzz

+0

Cảm ơn, đó là nghi ngờ ban đầu của tôi. Tôi đã được ấn tượng rằng mã thiết lập được chạy trước mỗi lần lặp, thay vì chỉ trước mỗi lần kiểm tra :) – jsdw