Xem xét khối mã này:Tại sao sử dụng các hàm được xác định trong cùng một mô-đun nhanh hơn cùng một hàm được xác định trong một mô-đun khác?
isPrime primes' n = foldr (\p r -> p * p > n || (n `rem` p /= 0 && r)) True primes'
primes = 2 : filter (isPrime primes) [3..]
main = putStrLn $ show $ sum $ takeWhile (< 1000000) primes
này sẽ tính tổng của tất cả các số nguyên tố dưới một triệu. Phải mất 0.468 giây để in kết quả trên máy của tôi. Nhưng nếu định nghĩa của isPrime
và primes
được trích xuất thành một mô-đun khác, chi phí thời gian là 1.23 giây, tốc độ này gần gấp 3 lần.
Tất nhiên tôi có thể sao chép/dán các định nghĩa ở mọi nơi cần thiết, nhưng tôi cũng tò mò về lý do tại sao điều này xảy ra và cách giải quyết nó.
[Chỉnh sửa] Tôi đang sử dụng GHC 7.0.3 (Windows 7 + MinGW). Mã được viết bằng EclipseFP (Nó sử dụng Scion như IDE back-end) và được tích hợp vào một tệp thi hành với các cờ -O2
.
Tôi cũng đã cố gắng xây dựng các gói bên ngoài IDE:
executable test
hs-source-dirs: src
main-is: Main.hs
build-depends: base >= 4
ghc-options: -O2
other-modules: Primes
executable test2
hs-source-dirs: src2
main-is: Main.hs
build-depends: base >= 4
ghc-options: -O2
Dưới đây là kết quả:
$ time test/test
37550402023
real 0m1.296s
user 0m0.000s
sys 0m0.031s
$ time test2/test2
37550402023
real 0m0.520s
user 0m0.015s
sys 0m0.015s
nó hoạt động! Cảm ơn! – claude
GHC sẽ thực hiện nội tuyến rất tích cực trong một mô-đun, đặc biệt nếu hàm được gạch chân không được xuất. Nó ít háo hức hơn với các hàm nội tuyến trên các ranh giới mô-đun, trừ khi bạn INLINE chúng theo cách thủ công. –