Ngôn ngữ chức năng nhanh nhất


18

Gần đây tôi đã đào sâu vào lập trình chức năng, đặc biệt là Haskell và F #, trước đó cũng vậy. Sau một vài lần loay hoay, tôi không thể tìm thấy một so sánh chuẩn của các ngôn ngữ chức năng nổi bật hơn (Scala, F #, v.v.).

Tôi biết rằng nó không nhất thiết phải công bằng với một số ngôn ngữ (Scala đến với tâm trí) cho rằng chúng là giống lai, nhưng tôi chỉ muốn biết cái nào vượt trội hơn những gì hoạt động và tổng thể.


18
Ngôn ngữ không nhanh hay chậm, triển khai được.
starblue

6
Việc triển khai ngôn ngữ không nhanh hay chậm, các chương trình chạy bằng các triển khai ngôn ngữ đó (khi so sánh với một số chương trình khác). Hãy làm từ thiện - khi ai đó nói về một ngôn ngữ lập trình nhanh hơn ngôn ngữ lập trình khác, cách rõ ràng có ý nghĩa là hiểu rằng họ đang nói về các chương trình cụ thể chạy bằng cách sử dụng ngôn ngữ cụ thể.
igouy

3
@starblue: Đó là một câu trả lời rất hay, và không phải là một câu trả lời rất hữu ích. Mặc dù chắc chắn có thể tạo ra hai triển khai của cùng một ngôn ngữ, một trong số đó chậm hơn so với ngôn ngữ kia, theo cách bạn đặt ở đó ngụ ý rằng không tồn tại các chi tiết thiết kế ngôn ngữ nhất thiết đòi hỏi sự thiếu hiệu quả nhất định khi thực hiện các ngôn ngữ khác, bởi các ngôn ngữ khác thiết kế, không yêu cầu. Và điều đó đơn giản là không đúng sự thật. (Đặc biệt trong chủ đề cụ thể này; ngôn ngữ chức năng nổi tiếng với chúng!)
Mason Wheeler

3
@igouy "Việc triển khai ngôn ngữ không nhanh hay chậm" Điều này không đúng. CPythonvs PyPynhanh chóng đến với tâm trí.
NlightNFotis

@NlightNFotis - CPython mất bao nhiêu giây? PyPy mất bao nhiêu giây? Ngôn ngữ thực hiện không nhanh hay chậm. Chương trình đó mất bao nhiêu giây với CPython?
igouy

Câu trả lời:


25

Theo Great Benchmark Game , ATS nhanh hơn phần còn lại với Haskell, Scala và một trong những biến thể của Common Lisp trong một chiếc cà vạt thô ráp cho tốc độ gần phía sau đó. Sau đó, Ocaml và F # thuộc cùng một loại tốc độ với Vợt và Clojure tụt lại phía sau ...

Tuy nhiên, hầu như không có điều này có nghĩa là bất cứ điều gì thực sự. Đó là tất cả một câu hỏi về vấn đề, máy móc, trình biên dịch, kỹ thuật mã hóa, và trong một số trường hợp, may mắn. Nói chung, các ngôn ngữ được mã hóa trực tiếp bằng máy như Haskell sẽ vượt trội hơn các ngôn ngữ được biên dịch VM như F # và vượt trội hoàn toàn so với các ngôn ngữ được giải thích thuần túy. Nói chung, các ngôn ngữ gõ tĩnh nhanh hơn gõ động do phân tích tĩnh cho phép tất cả các hoạt động loại được tính toán khi biên dịch thay vì thời gian chạy. Một lần nữa, đây là những quy tắc chung, sẽ luôn có ngoại lệ. "Nghịch lý" có rất ít liên quan đến nó.


Tôi biết có rất nhiều yếu tố cần xem xét và ngay cả khi tất cả mọi thứ đều hoàn hảo, chúng có thể thực hiện khác nhau trên các dữ liệu khác nhau, câu hỏi của tôi là một vấn đề khá mơ hồ. Cảm ơn liên kết, thực sự hữu ích - Tôi chưa bao giờ biết ATS nhanh
Farouk

Liên kết đẹp với thông tin so sánh chi tiết. Tôi hơi thất vọng khi thấy Clojure sử dụng nhiều bộ nhớ hơn và mất nhiều thời gian hơn Java. Tôi nhớ một số tuyên bố về Clojure có hiệu suất tương tự, dường như không phải là trường hợp.
DPM

Trang web ATS nói rằng ATS hỗ trợ nhiều mô hình lập trình - vì vậy trước khi bạn tuyên bố ATS nhanh hơn phần còn lại, bạn cần phải chứng minh rằng các chương trình đó thực tế được viết theo phong cách chức năng. Nó có thể chỉ là ATS chức năng không nhanh hơn phần còn lại.
igouy

2
Trang web Scala nói rằng Scala tích hợp các tính năng hướng đối tượng và chức năng. Bạn đã kiểm tra rằng các chương trình Scala được viết dưới dạng chương trình chức năng chứ không phải chương trình hướng đối tượng?
igouy

12

Cũng cần chỉ ra rằng bạn không thể đo / định lượng hiệu suất của ngôn ngữ lập trình . Điều tốt nhất bạn có thể làm là đo lường hiệu suất của việc triển khai ngôn ngữ cụ thể trên các nền tảng cụ thể, chạy các chương trình cụ thể.

Vì vậy, khi bạn hỏi về "ngôn ngữ chức năng nhanh nhất", những gì bạn thực sự hỏi về cách triển khai tốt nhất của ngôn ngữ hiện tại.


Nhận xét của @ igouy nêu lên quan điểm rằng có các biện pháp thực hiện khác để thực hiện ngôn ngữ; ví dụ thời gian biên dịch. Nhưng điều đó không thay đổi thực tế rằng thời gian chạy của chương trình ứng dụng là thước đo (gián tiếp) cho việc thực hiện ngôn ngữ, không phải là thước đo của chính ngôn ngữ đó.

Hãy xem xét Java chẳng hạn. Giả sử tôi viết một điểm chuẩn đơn luồng chỉ sử dụng các tính năng ngôn ngữ của Java cổ điển (Java 1.0). Nếu tôi biên dịch và chạy bằng JDK 1.0, tôi sẽ có hiệu năng kém ('vì JDK 1.0 không có trình biên dịch mã gốc). Nếu tôi đi từ JDK 1.1 đến ... JDK 1.7, rất có thể tôi sẽ nhận được kết quả tốt hơn dần dần. Nhưng điều này không phải do thay đổi ngôn ngữ Java ... bởi vì điểm chuẩn của tôi đang sử dụng cùng một tập hợp ngôn ngữ. Thay vào đó, việc tăng tốc là do những cải tiến trong trình biên dịch, hệ thống thời gian chạy và / hoặc việc thực hiện các thư viện lớp. Đây là tất cả các vấn đề thực hiện .

Điểm khác là những khác biệt thực hiện này có thể thực sự có ý nghĩa (ví dụ: thứ tự cường độ) cho cùng một ngôn ngữ. Vì vậy, thực tế là việc triển khai tốt nhất cho ngôn ngữ X nhanh hơn so với việc thực hiện tốt nhất (hoặc duy nhất) ngôn ngữ Y không nhất thiết phải cho bạn biết nhiều về chính ngôn ngữ đó.


Điều tốt nhất bạn có thể làm là đo lường hiệu suất của các chương trình cụ thể. Khi chúng tôi đo lường hiệu suất của việc thực hiện ngôn ngữ, chúng tôi muốn tìm hiểu mất bao lâu để biên dịch một số chương trình, chứ không phải chương trình đó mất bao lâu để chạy.
igouy

Thời gian chạy của chương trình là một thuộc tính của chương trình cụ thể đó khi chạy bằng cách sử dụng ngôn ngữ cụ thể đó trên phần cứng cụ thể đó, v.v. Cho rằng thời gian chạy của chương trình không phải là một thuộc tính của ngôn ngữ, nên cho phép trong ngữ cảnh này tên ngôn ngữ đang được sử dụng như một cách viết tắt cho việc triển khai ngôn ngữ nổi tiếng thông thường.
igouy

@igouy - đó là sự thật. Nhưng nhiều người không tạo ra sự khác biệt, như được minh họa bởi rất nhiều trang web cũ tuyên bố rằng "Java chậm. Thật không may, điều vô nghĩa này đã được đọc bởi cả một thế hệ lập trình viên ... và nó đã làm tổn hại đáng kể đến danh tiếng của Java. là lý do tại sao tôi thực hiện quan điểm này TẠI ĐÂY.
Stephen C

Như bạn muốn có quyền tự do nói - "một biện pháp (gián tiếp) trong việc thực hiện ngôn ngữ" - vui lòng giải thích lý do tại sao người khác không được tự do nói - một biện pháp (gián tiếp) của ngôn ngữ .
igouy

@igouy - 1) Bạn có thể tự do nói những gì bạn thích. Nhưng điều đó không làm cho bạn đúng. 2) Xem xét trường hợp việc thực hiện duy nhất một ngôn ngữ là tào lao. Chúng tôi điểm chuẩn nó. Sau đó, chúng tôi cập nhật việc thực hiện, điểm chuẩn nó và hiệu suất đã được cải thiện đáng kể. Điều đó có nghĩa là hiệu suất ngôn ngữ đã được cải thiện? Làm thế nào có ý nghĩa ... cho rằng ngôn ngữ KHÔNG thay đổi !!!
Stephen C

6

Nếu bạn chỉ nhìn vào các ngôn ngữ về tốc độ thực hiện, bạn đang thiếu một số điểm chính. Tốc độ là một điều tốt, nhưng nó không phải là điều duy nhất.

Haskell sử dụng một hệ thống loại rất mạnh mẽ để tạo ra các chương trình sẽ có nhiều khả năng không có lỗi và mạnh mẽ.

Erlang sử dụng hệ thống giám sát tích hợp của nó để cho phép bạn tạo các hệ thống lỗi có thể cung cấp cho bạn mức độ tin cậy rất lớn khi đối mặt với các loại lỗi khác nhau. Ngoài ra, Erlang có thể cung cấp cho bạn một mức độ tương tranh khó có thể sánh được với các ngôn ngữ khác.

Trong thực tế, tôi sẽ coi tốc độ thực hiện trong thời hiện đại là khá xa trong danh sách những gì tôi sẽ xem xét trong hầu hết các trường hợp. (OK nếu tôi đang thực hiện tính toán số lượng lớn, tôi có thể muốn sử dụng fortran cho tốc độ nhưng nếu không thì nó không đủ quan trọng để quan trọng)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.