2013-04-25 29 views
7

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 longlongSlow ở đó, 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ư V8spidermonkey, vẫn không tối ưu hóa vấn đề này.

Trả lời

4

Tôi đang tham khảo nguồn này: http://oreilly.com/server-administration/excerpts/even-faster-websites/writing-efficient-javascript.html#sect2

Sử dụng câu lệnh if khi:

  • Không có nhiều hơn hai giá trị rời rạc mà để kiểm tra.

  • Có một số lượng lớn các giá trị có thể dễ dàng được tách thành các phạm vi.

Sử dụng câu lệnh switch khi:

  • Hiện có hơn hai nhưng ít hơn 10 giá trị rời rạc mà để kiểm tra.

  • Không có phạm vi điều kiện nào vì các giá trị không tuyến tính.

Sử dụng mảng tra cứu khi:

  • Hiện có hơn 10 giá trị mà để kiểm tra.

  • Kết quả của các điều kiện là các giá trị đơn lẻ thay vì một số hành động cần thực hiện.

+3

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 :) –

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