Tôi chỉ học Haskell và viết hai chương trình từ một trang web hướng dẫn, chẳng hạn rằngTrong Haskell, hiệu suất và nơi ràng buộc
maximumnowhere :: (Ord a) => [a] -> a
maximumnowhere [] = error "empty"
maximumnowhere [x] = x
maximumnowhere (x:xs) = if x > maximumnowhere xs then x else maximumnowhere xs
và
maximumwhere :: (Ord a) => [a] -> a
maximumwhere [] = error "empty"
maximumwhere [x] = x
maximumwhere (x:xs) = if x > maximum' then x else maximum' where maximum' = maximumwhere xs
Tôi nghĩ hai chương trình này là khá tương đương, bởi vì tôi nghĩ, nơi mà ràng buộc chỉ thay thế biến với nội dung của nó. nhưng khi tôi chạy nó trong ghci, cái đầu tiên chậm hơn cái thứ hai, đặc biệt là với một mảng có chiều dài trên 25. Có lẽ, nơi mà ràng buộc tạo ra sự khác biệt lớn về hiệu năng này, nhưng tôi không biết tại sao. Bất cứ ai có thể giải thích nó cho tôi?
Người đầu tiên không chia sẻ các đánh giá về 'maximumnowhere xs' (được sử dụng trong cả trường hợp có điều kiện và trường hợp khác) - nếu bạn muốn chia sẻ, bạn nên tự mình thực hiện theo phiên bản thứ hai. –
Thêm thông tin thêm, GHC thường không loại bỏ sự biểu hiện phụ phổ biến (điều này sẽ làm cho cả hai phiên bản hoạt động giống nhau). Điều này là do CSE có thể giới thiệu rò rỉ không gian bằng ngôn ngữ lười biếng - xem Câu hỏi thường gặp về GHC - http://www.haskell.org/haskellwiki/GHC:FAQ#Does_GHC_do_common_subexpression_elimination.3F –
Tại sao mọi người sử dụng ghci để đo lường hiệu suất? Có một trình biên dịch tối ưu hóa bạn có thể thử nghiệm với .. –