Hai chức năng Haskell bên dưới dường như chỉ khác nhau khi biến chỉ mục là ẩn hoặc rõ ràng nhưng sự khác biệt về hiệu suất là bởi hai đơn vị độ lớn.Tối ưu hóa GHC
Chức năng này mất khoảng 0,03 giây để tính toán mfib 30:
let mfib = (map fib [0..] !!)
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
Chức năng này mất khoảng 3 giây cho mfib 30:
let mfib i = map fib [0..] !! i
where
fib 0 = 0
fib 1 = 1
fib x = mfib (x-1) + mfib (x-2)
Tôi đoán nó đã làm với GHC inline quy tắc và đã cố gắng thêm pragmas nội dòng/không có dòng để có được hiệu suất phù hợp.
EDIT: Tôi hiểu cách thực hiện tra cứu trong danh sách lười có thể được sử dụng để ghi nhớ chức năng fib và tại sao định nghĩa truyền thống về fib rất chậm. Tôi đã mong đợi việc ghi nhớ để làm việc trong chức năng thứ hai cũng như đầu tiên và không hiểu tại sao nó không phải là.
Điều quan trọng là * ghi nhớ *. Xem [tại đây] (http://stackoverflow.com/questions/11466284/how-is-this-fibonacci-function-memoized). –