Tôi đã được nói trong các câu hỏi trước đây rằng các ngôn ngữ lập trình chức năng không được sử dụng cho các hệ thống động như động cơ vật lý, chủ yếu là vì tốn kém để biến đổi các đối tượng. Làm thế nào thực tế là tuyên bố này, và tại sao?
Tôi đã được nói trong các câu hỏi trước đây rằng các ngôn ngữ lập trình chức năng không được sử dụng cho các hệ thống động như động cơ vật lý, chủ yếu là vì tốn kém để biến đổi các đối tượng. Làm thế nào thực tế là tuyên bố này, và tại sao?
Câu trả lời:
Cả Haskell và Clojure đều cho phép khả năng biến đổi thực tế, vì vậy đó không phải là vấn đề bắt đầu.
Ngoài ra, nếu dữ liệu "có thể thay đổi" của bạn bao gồm các giá trị trung gian được cập nhật tăng dần như một phần của một số tính toán lớn hơn, bạn thậm chí có thể không cần khả năng biến đổi để có hiệu quả! Ví dụ, có nghiên cứu liên tục ở Haskell liên quan đến một kỹ thuật gọi là hợp nhất luồng , trong đó trình biên dịch hợp nhất các vòng lặp xử lý, nhà sản xuất dữ liệu và người tiêu dùng dữ liệu để loại bỏ hoàn toàn cấu trúc dữ liệu trung gian.
Vấn đề chính với Haskell ở đây là sự lười biếng - trong một chương trình khủng hoảng số, nơi bạn có nhiều dữ liệu đầu vào và nhiều dữ liệu đầu ra và tất cả đều quan trọng, sự lười biếng của bạn rất ít ủng hộ nhưng vẫn áp đặt một số chi phí. Điều đó không có nghĩa là bạn không thể viết các chương trình như thế trong Haskell (thực tế là mọi người) nhưng nó không phát huy thế mạnh của ngôn ngữ và bạn cần hiểu rõ hơn về mô hình đánh giá để có được hiệu suất mà bạn muốn.
Điều đó nói rằng, việc bẻ khóa số nặng cũng không phát huy được thế mạnh của JVM. Đó là loại chương trình là lý do tại sao FORTRAN vẫn còn xung quanh.
Tôi không thể nói cho Clojure, nhưng tôi có thể nói Haskell có rất nhiều gói IO được điều chỉnh rất cao có sẵn sẽ cho phép tất cả các đột biến bạn có thể muốn.
Đây là câu trả lời cho câu hỏi tôi đã viết trong đó ai đó nêu chi tiết về 3 câu hỏi phổ biến nhất và liên quan đến hiệu suất của họ: /programming/15439966/when-why-use-an-mvar-over-a-tvar/15440286 # 15440286
Bạn cũng có thể thấy ở đây một biểu đồ đơn giản hiển thị số liệu hiệu suất của máy chủ web haskell có tên Warp, đây là một ứng dụng chuyên sâu IO.
Có rất nhiều nhầm lẫn về điều này liên quan đến Haskell, sự thật là nó có các cơ sở IO tuyệt vời với nhiều gói hack để sử dụng IO theo nhiều cách khác nhau, nhiều trong số đó đã được điều chỉnh cao. Lý do mọi người cho rằng đây không phải là trường hợp là vì Haskell đã nỗ lực hết sức để tách IO khỏi mọi thứ khác, nhưng điều đó không ảnh hưởng đến các đặc tính hiệu suất.
Tuy nhiên, bây giờ để nói về đặc điểm hiệu suất, lý do mọi người nhận ra nó có hiệu suất kém là do đánh giá lười biếng khiến nó hành xử theo cách không phải lúc nào cũng trực quan. Tuy nhiên, đây là điều bạn phải lo lắng ít hơn đáng kể khi bạn bắt đầu làm việc trong bối cảnh IO thực hiện các cập nhật mang tính hủy diệt, chẳng hạn như trong một hệ thống mà bạn đang đề cập. Những người xa hơn có xu hướng thấy rằng khi họ gặp rắc rối về hiệu suất, việc xây dựng các phương tiện để xác định và xác định nơi tài nguyên sẽ giúp ích rất nhiều.
Một đơn nguyên khác đáng để tìm kiếm một hệ thống như bạn mô tả sẽ là đơn vị ST dành riêng cho các cập nhật mang tính hủy diệt được thực hiện bởi các lệnh gọi IO rất nhỏ mang lại hiệu năng tuyệt vời.
Xin lỗi tôi thực sự không thể nói chuyện với Clojure, hy vọng người khác có thể cung cấp chi tiết ở đó.
Due to the functional programming style the computational load will be distributed over the available CPU cores which can dramatically increase processing speed in some cases