2010-01-13 27 views
15

Hiện tại, hầu hết các trình duyệt chính đã bắt đầu tích hợp tối ưu hóa các trình biên dịch JIT vào các trình thông dịch JavaScript/các máy ảo của chúng. Điều đó tốt cho mọi người. Bây giờ, tôi sẽ rất khó để biết chính xác những tối ưu nào họ thực hiện và cách tận dụng tốt nhất chúng. Tài liệu tham khảo về tối ưu hóa trong mỗi công cụ JavaScript chính là gì?Những công cụ JavaScript hiện đại nào tối ưu hóa hoạt động?

Bối cảnh:

tôi đang làm việc trên một trình biên dịch mà tạo ra JavaScript từ một cấp cao hơn & ngôn ngữ an toàn hơn (không biết xấu hổ cắm: nó được gọi là OPA và nó rất mát mẻ) và với kích thước của ứng dụng Tôi tạo ra, tôi muốn mã JavaScript của mình hoạt động nhanh và hiệu quả về bộ nhớ nhất có thể. Tôi có thể xử lý các tối ưu hóa ở mức cao, nhưng tôi cần biết thêm về các phép biến đổi thời gian chạy nào được thực hiện, để biết mã cấp thấp nào sẽ tạo ra các kết quả tốt nhất.

Một ví dụ, từ đầu tôi: ngôn ngữ tôi đang biên dịch sẽ sớm tích hợp hỗ trợ cho sự lười biếng. Động cơ JIT có hoạt động tốt với các định nghĩa chức năng lười biếng không?

+3

Cá nhân, tôi nghĩ rằng cách tốt nhất để tận dụng lợi thế của optimisations trình biên dịch/JIT là chỉ cần tạo ra mã của bạn như là một cách tự nhiên, như thể đọc được , và như duy trì càng tốt và để cho trình biên dịch/jit làm việc đó là phép thuật. Bất kỳ nỗ lực cụ thể nào nhắm mục tiêu tối ưu hóa trình biên dịch có thể sẽ dẫn đến mã ít bảo trì hơn và trong một hoặc hai năm khi các trình biên dịch có tất cả được thay đổi, tối ưu hóa của bạn sẽ không còn hợp lệ nữa. –

+0

Vâng, mã có thể đọc/duy trì không thực sự là mục tiêu của tôi. Tôi đang biên dịch từ một ngôn ngữ hoàn toàn khác với JS, vì vậy tôi không mong đợi bất cứ ai đọc nhiều trên JS được tạo ra. Đối với phép thuật JIT và tính hiệu lực của tối ưu hóa, tốt, có, bạn có một điểm. – Yoric

Trả lời

15

This article series thảo luận về các tối ưu hóa của V8. Nói tóm lại:

  • Nó tạo mã nguồn gốc máy - không bytecode (V8 Design Elements)
  • chính xác bộ sưu tập rác (Wikipedia)
  • Inline bộ nhớ đệm các phương pháp được gọi là (Wikipedia)
  • Lưu trữ chuyển tiếp lớp học thông tin để các đối tượng có cùng thuộc tính được nhóm lại với nhau (V8 Design Elements)

Hai điểm đầu tiên có thể không giúp bạn rất nhiều trong tình huống này. Thứ ba có thể hiển thị thông tin chi tiết về việc lưu trữ mọi thứ cùng nhau. Cuối cùng có thể giúp bạn tạo các đối tượng với các thuộc tính giống nhau để chúng sử dụng cùng các lớp ẩn.

This blog post thảo luận một số optimisations của SquirrelFish cực:

  • Bytecode tối ưu hóa
  • bộ nhớ cache nội tuyến đa hình (như V8)
  • bối cảnh luồng JIT (giới thiệu bản địa sinh mã máy, giống như động cơ V8)
  • Cụm từ thông dụng JIT

TraceMonkey is optimised via tracing. Tôi không biết nhiều về nó nhưng có vẻ như nó phát hiện loại biến trong một số mã "mã nóng" (mã chạy trong vòng lặp thường xuyên) và tạo mã được tối ưu hóa dựa trên loại biến đó là gì. Nếu kiểu biến thay đổi, nó phải biên dịch lại mã dựa trên điều này, tôi muốn nói bạn nên tránh xa việc thay đổi kiểu biến trong vòng lặp.

+1

Thu gom rác chính xác? ...: S –

+0

Thú vị, cảm ơn. Tôi sẽ cần phải xem xét chuyển tiếp lớp học. Bây giờ, trên các trình duyệt khác :) – Yoric

+0

Đọc tài liệu V8. Đọc TM. SF đọc. Lưu ý phụ: các kỹ thuật SF được mô tả trông, tốt, khá đáng thất vọng. Đặc biệt, như đã mô tả, Thext Context của họ trông có vẻ dumber hơn hầu hết các kỹ thuật JIT mà tôi biết. – Yoric

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