2015-09-19 20 views
7

Mã này:Tại sao mã này cư xử khác nhau ở giá trị khác nhau

var i = 10000000000; 
do { 
    i--; 
} 
while (i !== 0); 
//Result: 38 second. 

var i = 10000000000; 
do {} 
while (i-- !== 0); 
//Result: 27 second. 
//(same result with while (i--) 

var i = 10000000000; 
do {} 
while (i-- | 0); 
//Result: 13.5 second. 

Câu hỏi đặt ra là: Tại sao các phiên bản được đồng thời cho giá trị nhỏ hơn của tôi? Nếu tôi cắt một số không từ i; tất cả các phiên bản cần 2,2 giây. (được kiểm tra ngay cả sau khi tối ưu hóa JIT - chỉ trong V8)

Có vẻ hợp lý rằng phiên bản thứ ba phải luôn nhanh hơn nhưng chỉ nhanh hơn cho các giá trị rất cao.

Đó chỉ là sự tò mò ... không thực sự quan trọng.

+0

Tôi đã cố gắng để đưa chúng vào jsperf nhưng nó có xu hướng sụp đổ trình duyệt của tôi http://jsperf.com/do-while-speed-test. Hãy nhớ rằng các công cụ javascript khác nhau sẽ dẫn đến các kết quả khác nhau, vì chúng ưu tiên những thứ khác nhau. Nó có thể đi xuống một cái gì đó đơn giản như cách xử lý các con số của hệ điều hành bên dưới. (UPDATE: các thử nghiệm đã chạy nhưng JSperf đang ném một lỗi về việc thiếu thuộc tính 'name' của nó. Không có ý tưởng tại sao điều đó xảy ra) – somethinghere

+4

Điều cuối cùng là nhanh nhất vì nó chỉ lặp lại 1410065408 lần và thực sự là 1/3 tốc độ của giây phiên bản, tức là 104449290 mỗi giây và 370370370 mỗi giây –

+0

Quan sát tốt. Không quan sát điều đó. –

Trả lời

0

Bộ vi xử lý, hệ điều hành và trình thông dịch có thể ảnh hưởng đến tốc độ của chương trình theo những cách khó dự đoán. Đó là lý do tại sao ký hiệu oh lớn được sử dụng để đánh giá các thuật toán.

Một trong những lý do tại sao tốc độ có thể khác ở đây là với một giá trị nhỏ hơn, giá trị i của bạn có thể được biểu thị chỉ bằng 32 bit. Vì vậy, mã lắp ráp được tạo bởi trình thông dịch có thể thực hiện tối ưu hóa và sử dụng các chỉ lệnh của các số nguyên 32 bit.

Giá trị i trong mã cuối cùng được chuyển thành số nguyên 32 bit thay đổi số lần lặp lại và đó là lý do tại sao nó hoạt động nhanh hơn khi giá trị i không thể diễn tả chỉ bằng 32 bit.

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