Có một điều bị lãng quên về tối ưu hóa ở đây.
Đã có cuộc tranh luận lâu dài về fortran vượt trội hơn C. Đặt ra cuộc tranh luận không đúng định dạng: cùng một mã được viết bằng C và fortran (như người kiểm tra nghĩ) và hiệu suất đã được kiểm tra dựa trên cùng một dữ liệu. Vấn đề là, các ngôn ngữ này khác nhau, C cho phép con trỏ răng cưa, trong khi fortran thì không.
Vì vậy, các mã không giống nhau, không có __restrict trong các tệp được kiểm tra C, điều này mang lại sự khác biệt, sau khi viết lại các tệp để nói với trình biên dịch rằng nó có thể tối ưu hóa con trỏ, thời gian chạy trở nên tương tự.
Vấn đề ở đây là, một số kỹ thuật tối ưu hóa dễ dàng hơn (hoặc bắt đầu hợp pháp) trong ngôn ngữ mới được tạo.
X
Thứ hai VM có thể thực hiện kiểm tra áp suất trong khi chạy, do đó, nó có thể lấy mã áp lực và tối ưu hóa nó hoặc thậm chí tính toán trước trong thời gian chạy. Chương trình C được biên dịch trước không mong đợi áp lực ở đâu hoặc (phần lớn thời gian) có các phiên bản chung của các tệp thực thi cho dòng máy nói chung.
Trong thử nghiệm này cũng có JS, cũng có VM nhanh hơn V8 và nó cũng hoạt động nhanh hơn C trong một số thử nghiệm.
Tôi đã kiểm tra nó và có những kỹ thuật tối ưu hóa độc đáo chưa có trong trình biên dịch C.
Trình biên dịch C sẽ phải thực hiện phân tích tĩnh toàn bộ mã cùng một lúc, diễu hành trên nền tảng nhất định và giải quyết các vấn đề liên kết bộ nhớ.
VM chỉ phiên âm một phần mã để tối ưu hóa lắp ráp và chạy nó.
Về Julia - khi tôi kiểm tra nó hoạt động trên AST của mã, ví dụ GCC đã bỏ qua bước này và gần đây mới bắt đầu lấy một số thông tin từ đó. Điều này cộng với các ràng buộc khác và các kỹ thuật VM có thể giải thích một chút.
Ví dụ: chúng ta hãy thực hiện vòng lặp đơn giản, lấy điểm kết thúc bắt đầu từ các biến và tải một phần biến vào các phép tính biết trong thời gian chạy.
Trình biên dịch C tạo các biến tải từ các thanh ghi.
Nhưng trong thời gian chạy, các biến này được biết và được coi là hằng số thông qua thực thi.
Vì vậy, thay vì tải các biến từ các thanh ghi (và không thực hiện bộ đệm vì nó có thể thay đổi và từ phân tích tĩnh thì không rõ) chúng được xử lý hoàn toàn giống như các hằng số và được gấp lại, lan truyền.