Lý do chính Math.floor
là chậm hơn (nơi thực sự là - trong một số thử nghiệm tôi đã thực hiện nó nhanh hơn) là nó liên quan đến một cuộc gọi chức năng. Các triển khai JavaScript cũ hơn không thể thực hiện các cuộc gọi hàm nội tuyến. Các công cụ mới hơn có thể nội tuyến cuộc gọi, hoặc ít nhất là tra cứu tài sản nhanh hơn, nhưng chúng vẫn cần một điều kiện bảo vệ trong trường hợp bạn (hoặc một số tập lệnh khác) ghi đè hàm Math.floor
. Tuy nhiên, chi phí rất thấp, vì vậy không có nhiều khác biệt về tốc độ.
Quan trọng hơn mặc dù, như đã được đề cập trong một số ý kiến, các phương pháp khác không tương đương. Tất cả đều hoạt động bằng cách thực hiện các thao tác bitwise. Các toán tử bitwise tự động chuyển đổi các toán hạng của chúng thành các số nguyên 32 bit bằng cách cắt bớt số. Đó là tốt nếu số lượng phù hợp trong 32 bit, nhưng số JavaScript là 64-bit nổi, có thể lớn hơn nhiều so với 2147483647.
Chúng cũng cho kết quả khác nhau cho số âm, kể từ khi chuyển sang số nguyên cắt và Math.floor
luôn luôn tròn xuống. Ví dụ: Math.floor(-2.1) === -3
, nhưng (-2.1) | (-2.1) === -2
.
Nếu bạn biết bạn chỉ xử lý các số dương nhỏ hơn 2147483648 và bạn cần phải nén từng chút hiệu suất ra khỏi mã của mình trong các trình duyệt cũ hơn (Hãy chắc chắn đây thực sự là nút cổ chai đầu tiên. .), Tôi sẽ sử dụng một phương pháp đơn giản hơn: x|0
. Nó không đánh giá biến hai lần, và nó hoạt động ngay cả khi x
là một biểu thức (chỉ cần chắc chắn để đặt nó trong dấu ngoặc đơn, do đó bạn không chạy vào các vấn đề ưu tiên).
Nguồn
2010-03-26 23:34:54
'~~ n',' n | n' và 'n & n' không tạo ra kết quả tương tự như' Math.floor'. Ba đầu tiên chỉ có thể trả về số nguyên 32 bit. Hãy thử 'n = 50000000000.4'. – kennytm
Trong trình duyệt của tôi (FF 3.6.something), chúng đều có cùng tốc độ trong kết quả (khoảng "3", bất kể điều đó có nghĩa là gì). Hãy thử nó trên các trình duyệt khác nhau (các thử nghiệm nhỏ được cung cấp ở phía dưới) thay vì chỉ lấy kết quả theo mệnh giá. Có thực sự là không có lý do tại sao nó nên được chú ý chậm hơn. –
Trên thực tế, chạy điểm chuẩn của mình trong FF 3.6 cho thấy 'Math.floor' là nhanh nhất –