2011-09-25 11 views
7

Tôi đã đọc the article about Google's upcoming DASH/DART language, điều mà tôi thấy khá thú vị.Làm cách nào để Dart của Google có được hiệu suất tốt hơn?

Một điều tôi tình cờ gặp phải là họ nói rằng họ sẽ xóa các vấn đề hiệu suất vốn có của JavaScript. Nhưng những vấn đề hiệu suất này chính xác là gì? Không có bất kỳ ví dụ nào trong văn bản. Đây là tất cả nó nói:

  • Performance - Dash được thiết kế với đặc tính hiệu suất trong tâm, do đó nó có thể tạo máy ảo mà không có hiệu suất vấn đề mà tất cả ECMAScript VM phải có.

Bạn có bất kỳ ý tưởng nào về những vấn đề về hiệu suất vốn có không?

+1

Điểm chuẩn hoặc điều đó không xảy ra. Suy đoán về hiệu suất của một cái gì đó chưa được phát hành là nhảm nhí. – fijal

+0

Điều thú vị là Dart dường như ** chậm hơn ** so với JS. – c69

Trả lời

5

Một ví dụ là loại bỏ tail call (Tôi chắc chắn một số xem xét nó cần thiết cho hiệu suất cao functional programming). Một feature request được đưa vào cho V8 javascript VM của Google, nhưng đây là câu trả lời:

gọi Tail loại bỏ là không tương thích với JavaScript như nó được sử dụng trong thực tế thế giới.

+0

Hoàn hảo, chỉ là những gì tôi đang tìm kiếm! – Sune1987

8

chủ đề này là phải đọc cho bất cứ ai quan tâm đến ngôn ngữ năng động chỉ trong trình biên dịch thời gian: http://lambda-the-ultimate.org/node/3851

Những người tham gia trong chủ đề này là tác giả của luajit, các folks PyPy, các nhà phát triển javascript của Mozilla và nhiều hơn nữa . Đặc biệt chú ý đến bình luận của Mike Pall (anh ấy là tác giả của luajit) và ý kiến ​​của anh ấy về javascript và python nói riêng. Ông nói rằng thiết kế ngôn ngữ ảnh hưởng đến hiệu suất. Ông cho tầm quan trọng để đơn giản và trực giao, trong khi tránh các trường hợp góc điên mà bệnh dịch hạch javascript, ví dụ.

Nhiều kỹ thuật và phương pháp tiếp cận khác nhau được thảo luận ở đó (truy tìm jits, jits phương pháp, thông dịch viên, v.v.). Hãy khám phá!

Luis

6

Bài viết đề cập đến những khó khăn tối ưu hóa đến từ các ngôn ngữ cực kỳ năng động như JavaScript, cộng với nguyên mẫu thừa kế.

Trong các ngôn ngữ như Ruby hoặc JavaScript, cấu trúc chương trình có thể thay đổi khi chạy. Các lớp có thể nhận được một phương thức mới, các hàm có thể được eval() 'ed vào sự tồn tại, và nhiều hơn nữa. Điều này làm cho khó khăn hơn cho các runtimes để tối ưu hóa mã của họ, bởi vì cấu trúc không bao giờ được đảm bảo được thiết lập.

Thừa kế nguyên mẫu khó tối ưu hóa hơn các ngôn ngữ dựa trên lớp truyền thống khác. Tôi nghi ngờ điều này là bởi vì có nhiều năm kinh nghiệm nghiên cứu và triển khai cho các máy ảo dựa trên lớp.

Điều thú vị là V8 (công cụ JavaScript của Chrome) sử dụng các lớp ẩn như một phần của chiến lược tối ưu hóa của nó. Tất nhiên, JS không có các lớp, do đó bố cục đối tượng phức tạp hơn trong V8.

Bố cục đối tượng trong V8 yêu cầu tối thiểu 3 từ trong tiêu đề. Ngược lại, Dart VM chỉ yêu cầu 1 từ trong tiêu đề. Kích thước và cấu trúc của đối tượng Dart được biết tại thời gian biên dịch.Điều này rất hữu ích cho các nhà thiết kế VM.

Ví dụ khác: trong Dart, có danh sách thực (còn gọi là mảng). Bạn có thể có một danh sách độ dài cố định, dễ dàng hơn để tối ưu hóa hơn so với các mảng không thực sự của JavaScript và luôn có độ dài thay đổi.

Đọc thêm về biên soạn Dart (và JavaScript) vào mã hiệu quả với các trình bày này: http://www.dartlang.org/slides/2013/04/compiling-dart-to-efficient-machine-code.pdf

chiều hiệu suất khác là thời gian khởi động. Khi các ứng dụng web trở nên phức tạp hơn, số lượng các dòng mã tăng lên. Thiết kế JavaScript làm cho việc tối ưu hóa khởi động khó khăn hơn, vì việc phân tích cú pháp và tải mã cũng thực thi mã. Trong Dart, ngôn ngữ đã được thiết kế cẩn thận để phân tích cú pháp nhanh chóng. Dart không thực thi mã khi nó tải và phân tích cú pháp các tệp.

Điều này cũng có nghĩa là máy ảo Dart có thể lưu bộ nhớ cache biểu diễn nhị phân của tệp được phân tích cú pháp (được gọi là ảnh chụp nhanh) để khởi động nhanh hơn nữa.