Tôi đang sử dụng báo cáo switch-case
trên cơ sở thường xuyên trong ECMAscript. Bên cạnh xác nhận cá nhân của tôi về nó, có rất nhiều tài liệu chuyên môn, về hiệu suất trong ngôn ngữ này nói chung và về các câu lệnh có điều kiện là có điều kiện.hiệu suất chuyển đổi trong ECMAscript
Ví dụ điển hình mà tôi nhớ là một cuốn sách tuyệt vời "Hiệu suất cao Javascript" của Nicholas Zakas. Giống như trong nhiều sách và bài báo khác, người ta nói rằng tuyên bố switch-case
luôn nhanh hơn câu lệnh if (else)
khi bạn đang sử dụng hơn hai trường hợp có điều kiện.
Trong bất kỳ C-like ngôn ngữ tôi biết, một tuyên bố switch-case
là không có gì khác hơn là một nhị phân-băm-bản đồ đó, chia nhỏ một lần nữa, là một chuỗi các mã jmp trong lắp ráp. Có một tốt đọc here
Tuy nhiên, sau lời tựa này:
tôi đã có một cuộc thảo luận về việc sử dụng chức năng xử lý sự kiện với đội của tôi và làm thế nào chúng ta sẽ đối phó với các loại sự kiện. Có hay không chúng tôi sẽ sử dụng hàm rõ ràng cho bất kỳ sự kiện nào hoặc nếu chúng ta nên sử dụng một hàm lớn xử lý nhiều loại sự kiện . Trong cuộc thảo luận đó, vấn đề hiệu suất phát triển và chúng tôi đã tạo ra một rất cơ bản, đơn giản jsPerf:
http://jsperf.com/engine-context-data-caching-test/3
Và tôi đã được khá nhiều bất ngờ về kết quả và những gì tôi thấy. Tin tưởng vào những trường hợp thử nghiệm này, đơn đặt hàng của case statements
là rất quan trọng đối với hiệu suất thực thi. Sự khác biệt giữa long
và longSlow
ở đó, chỉ có một vị trí trong tuyên bố case 'baz'
trong tuyên bố switch
. Điều này có thực và hợp lý không?
Có cơ hội nào tôi bỏ qua điều gì đó không? Đầu tiên, tôi nghĩ tốt, có thể không đủ case
báo cáo của nó và thông dịch viên sẽ chỉ tạo ra if-else
điều kiện dưới mui xe, vì vậy tôi tăng số lượng mà không có bất kỳ thay đổi trong kết quả.
Tôi chỉ từ chối tin rằng các công cụ ECMAscript như V8 và spidermonkey, vẫn không tối ưu hóa vấn đề này.
Câu trả lời của bạn được đánh giá cao nhưng hoàn toàn không trả lời được câu hỏi. Bạn nên đọc lại câu hỏi và có thể cung cấp câu trả lời chuyên sâu :) –