2013-02-26 17 views
12

Xem xét chức năng này:Trình tối ưu hóa Haskell có sử dụng tính năng ghi nhớ cho các cuộc gọi hàm lặp lại trong phạm vi không?

f as = if length as > 100 then length as else 100 

Kể từ khi chức năng là tinh khiết rõ ràng là chiều dài sẽ là như nhau trong cả hai cuộc gọi. Câu hỏi của tôi là trình tối ưu hóa Haskell có thể biến mã ở trên thành tương đương với những điều sau không?

f as = 
    let l = length as 
    in if l > 100 then l else 100 

Nếu có, thì cài đặt mức nào sẽ bật? Nếu không, thì tại sao? Trong trường hợp này, lãng phí bộ nhớ không thể là lý do được giải thích trong this answer, bởi vì biến được giới thiệu được phát hành ngay sau khi thực hiện hàm xong.


Xin lưu ý rằng đây không phải là bản sao của this question vì phạm vi địa phương và do đó có thể nhận được câu trả lời hoàn toàn khác.

Trả lời

15

GHC hiện tại some CSE by default, khi cờ -fcse được bật.

Theo mặc định .. Cho phép loại bỏ biểu thức phụ biểu thức tối ưu hóa. Việc tắt tính năng này có thể hữu ích nếu bạn có một số biểu thức unsafePerformIO mà bạn không muốn phổ biến.

Tuy nhiên, nó là conservative, do sự cố khi giới thiệu chia sẻ (và do đó rò rỉ không gian). Thẻ CSE đang nhận được bit better mặc dù (và this).

Cuối cùng, lưu ý có một plugin cho CSE đầy đủ.

Nếu bạn có mã mà có thể được hưởng lợi từ đó.

13

Ngay cả trong một cài đặt cục bộ như vậy, nó vẫn là trường hợp không rõ ràng là việc giới thiệu chia sẻ luôn là một tối ưu hóa. Hãy xem xét ví dụ định nghĩa này

f = if length [1 .. 1000000] > 0 then head [1 .. 1000000] else 0 

vs. này một

f = let xs = [1 .. 1000000] in if length xs > 0 then head xs else 0 

và bạn sẽ thấy rằng trong trường hợp này, người đầu tiên cư xử tốt hơn nhiều, như mỗi người trong số các tính toán được thực hiện trên danh sách là giá rẻ, trong khi phiên bản thứ hai sẽ khiến danh sách được mở hoàn toàn trong bộ nhớ của length và chỉ có thể bị hủy sau khi head bị giảm.

+3

Mặc dù vấn đề này, ghc có thể tích cực hơn nhiều với CSE. Bạn chỉ cần có một ước tính kích thước của giá trị bạn đang CSEing. Một ước tính đơn giản là các loại cơ sở chiếm không gian cẩu thả. – augustss

+0

@augustss Đồng ý. – kosmikus

+0

Làm thế nào là 'chiều dài [1 .. 1000000]> 0' một hoạt động giá rẻ? Sẽ không "chiều dài" phải trở lại trước khi ">" được đánh giá?(Trong ghci, hoạt động bị chậm lại đáng kể khi tôi tăng kích thước của danh sách) –

Các vấn đề liên quan