2016-02-22 36 views
18

Tôi rất muốn biết chính xác những gì làm cho Crystal nhanh hơn Ruby trong khi mã rất giống nhau. Câu trả lời ngắn có thể là nó được biên dịch, và Ruby được giải thích, nhưng tôi muốn hiểu thêm về các đặc tả ngôn ngữ.Tại sao Crystal lại nhanh hơn Ruby?

Trả lời

31

Tôi đoán đó là một sự kết hợp của sự vật:

  • Ruby giải thích, và người phiên dịch có thể được cải thiện. Ví dụ các ngôn ngữ thông dịch khác như JS hay Java có trình biên dịch VM và JIT rất tốt.
  • Nhiều kiểm tra Ruby được thực hiện khi chạy, trong Crystal được thực hiện tại thời gian biên dịch. Ví dụ, một lời gọi phương thức đơn giản trong Ruby kết thúc bằng tra cứu phương thức. Ngay cả với một bộ nhớ cache nó sẽ không đánh bại một cuộc gọi chức năng bản địa. Hoặc khi Ruby quyết định làm những việc khác nhau dựa trên kiểu của một đối số, các kiểm tra này được thực hiện khi chạy. Trong Crystal, chúng được biết đến lúc biên dịch nên những kiểm tra đó biến mất. Nếu không có những kiểm tra trình biên dịch có thể gọi nội tuyến và làm một số công cụ khá điên (nhờ LLVM). Hoặc, ví dụ, tìm kiếm một biến thể hiện là một tra cứu băm trong Ruby (theo như tôi biết), trong khi trong Crystal nó chỉ là một bộ nhớ indirection và tải.
  • Trong Crystal, chúng tôi cố gắng tránh phân bổ bộ nhớ bổ sung. Ví dụ: to_s(io) ghi vào một IO thay vì chuyển đổi đối tượng thành một chuỗi trong bộ nhớ. Hoặc chúng tôi có bộ dữ liệu cho các mảng có kích thước cố định được phân bổ trên ngăn xếp. Hoặc bạn có thể khai báo một kiểu như một cấu trúc để tránh phân bổ đống.
  • Cuộc gọi đến C được thực hiện trực tiếp mà không có trình bao bọc. Vâng, bạn có thể có một wrapper nhưng điều đó sẽ được inline bởi LLVM. Trong Ruby nó luôn phải giải quyết một phương thức Ruby trước.

Có thể có nhiều lý do khác, nhưng chúng có liên quan.

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