Tôi mới lập trình và học Haskell bằng cách đọc và làm việc thông qua các vấn đề về Dự án Euler. Tất nhiên, điều quan trọng nhất người ta có thể làm để cải thiện hiệu suất trên những vấn đề này là sử dụng một thuật toán tốt hơn. Tuy nhiên, rõ ràng với tôi rằng có những cách đơn giản và dễ thực hiện khác để cải thiện hiệu suất. Một tìm kiếm lướt qua mang lên this question, và this question, trong đó cung cấp các mẹo sau đây:Các mẹo đơn giản để tăng hiệu suất của Haskell (đối với các vấn đề về ProjectEuler)?
- Sử dụng cờ GHC -O2 và -fllvm.
- Sử dụng loại Int, thay vì Integer, vì nó không được hộp (hoặc thậm chí là Integer thay vì Int64). Điều này đòi hỏi phải gõ các chức năng, không để cho trình biên dịch quyết định trên bay.
- Sử dụng rem, không mod, để thử nghiệm phân chia.
- Sử dụng Schwartzian transformations khi thích hợp.
- Sử dụng bộ tích lũy trong các hàm đệ quy (tối ưu hóa đệ quy đuôi, tôi tin).
- Memoization
(Một câu trả lời cũng đề cập đến lao động/chuyển đổi wrapper, nhưng điều đó dường như khá tiên tiến.)
Câu hỏi (?): gì khác tối ưu đơn giản người ta có thể thực hiện trong Haskell để cải thiện hiệu suất về các vấn đề kiểu Euler? Có bất kỳ ý tưởng hoặc tính năng cụ thể nào khác của Haskell (hoặc chức năng lập trình cụ thể không?) Có thể được sử dụng để giúp tăng tốc các giải pháp cho các vấn đề của Project Euler? Ngược lại, những gì nên xem ra cho? Một số điều phổ biến nhưng không hiệu quả cần tránh là gì?
Wow, liên kết tuyệt vời. Cảm ơn. – identity
Các trang trình bày trước đó của nhà văn tương tự http://blog.johantibell.com/2010/09/slides-from-my-high-performance-haskell.html rộng hơn; và http://johantibell.com/files/stanford-2011/performance.html là một nghiên cứu điển hình. Có sự chồng chéo đáng kể, nhưng nó không làm hại tôi. – applicative