2011-07-13 22 views
6

Trong bài đăng trên blog của mình The Glasgow Haskell Compiler and LLVM, David Terei đã sử dụng một ví dụ tạo ra chuỗi đá mưa để so sánh hiệu suất của GHC với C. Tôi quyết định tự chạy nó và kết quả là không thể tin được: GHC phiên bản chậm hơn một độ. Mã này là đủ ngây thơ:Một trình tự hailstone chậm chạp hơn trong haskell so với c

import Data.Word 

collatzLen :: Int -> Word32 -> Int 
collatzLen c 1 = c 
collatzLen c n | n `mod` 2 == 0 = collatzLen (c+1) $ n `div` 2 
       | otherwise  = collatzLen (c+1) $ 3*n+1 

pmax x n = x `max` (collatzLen 1 n, n) 

main = print . solve $ 1000000 
    where solve xs = foldl pmax (1,1) [2..xs-1] 

Trừ thay foldl với foldl', tôi không nghĩ rằng tôi có thể làm bất cứ điều gì với nó. Phiên bản GHC tìm thấy câu trả lời trong 45 giây, bất kể phụ trợ nào tôi sử dụng, trong khi phiên bản C chỉ sử dụng 1,5 giây!

Thiết lập của tôi là nền tảng Haskell 2011.2.0.1 (32 bit) + OS X 10.6.6 so với gcc 4.2.1. David đã sử dụng GHC 6.13 trong bài viết của mình. Đây có phải là lỗi đã biết của GHC 7.0.3 không? Hoặc tôi chắc đã bỏ lỡ điều gì đó rất rõ ràng.

EDIT: Hóa ra tôi đã bỏ lỡ điều gì đó hiển nhiên. Chỉ đơn giản bằng cách sử dụng cờ -O2, ghc tạo mã rất nhanh ngay bây giờ.

+4

biên dịch cờ nào bạn đang sử dụng? Đối với tôi, mã này thực thi trong 4 giây khi được biên dịch với 'ghc-7.0.4 -O2'. '-O' chỉ chậm hơn một chút. –

+3

@John L, tôi đã sử dụng '' '--make -fforce-recomp -fllvm'''. Bằng cách sử dụng '' '-O2''' như bạn đã đề xuất, ghc ngang bằng với gcc. Cảm ơn. – edwardw

+0

@edwardw, câu hỏi của bạn là gì? – eternalmatt

Trả lời

6

Câu hỏi của tôi là lý do tại sao GHC tạo ra mã chậm như vậy trong trường hợp cụ thể này. Câu trả lời là sử dụng cờ tối ưu hóa, -O, -O2, v.v. Bằng cách sử dụng nó, tôi thấy thời gian thực hiện giảm từ 45 giây xuống 0,6 giây, cải thiện ~ 80x.

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