Tôi có một hàm không đệ quy để tính toán các chuỗi phổ biến dài nhất có vẻ hoạt động tốt (ghc 7.6.1
, được biên dịch với -O2 -fllvm
cờ) nếu tôi đo nó bằng Criterion
trong cùng một mô-đun. Mặt khác, nếu tôi chuyển đổi hàm thành một mô-đun, chỉ xuất hàm đó (như được đề xuất here) và sau đó đo lại với Tiêu chí, tôi nhận được ~ 2x chậm lại (biến mất nếu tôi di chuyển kiểm tra tiêu chí trở lại mô-đun nơi hàm được xác định). Tôi đã thử đánh dấu hàm bằng INLINE
pragma mà không tạo ra bất kỳ sự khác biệt nào về các phép đo hiệu suất mô-đun chéo. Dường như với tôi rằng GHC có thể phân tích nghiêm ngặt hoạt động tốt khi chức năng và chức năng chính (từ đó chức năng có thể truy cập) nằm trong cùng một mô-đun, nhưng không phải khi chúng được phân chia. Tôi sẽ đánh giá cao con trỏ về cách mô đun hóa chức năng để nó hoạt động tốt khi được gọi từ các mô-đun khác. Mã được đề cập quá lớn để dán ở đây - bạn có thể thấy mã số here nếu bạn muốn dùng thử. Một ví dụ nhỏ về những gì tôi đang cố gắng làm là bên dưới (với đoạn mã):Tối ưu hóa mô-đun chéo trong GHC
-- Function to find longest common subsequence given unboxed vectors a and b
-- It returns indices of LCS in a and b
lcs :: (U.Unbox a, Eq a) => Vector a -> Vector a -> (Vector Int,Vector Int)
lcs a b | (U.length a > U.length b) = lcsh b a True
| otherwise = lcsh a b False
-- This section below measures performance of lcs function - if I move it to
-- a different module, performance degrades ~2x - mean goes from ~1.25us to ~2.4us
-- on my test machine
{--
config :: Config
config = defaultConfig { cfgSamples = ljust 100 }
a = U.fromList ['a'..'j'] :: Vector Char
b = U.fromList ['a'..'k'] :: Vector Char
suite :: [Benchmark]
suite = [
bench "lcs 10" $ whnf (lcs a) b
]
main :: IO()
main = defaultMainWith config (return()) suite
--}
Hãy thử INLINEABLE để thay thế. Nó có thể hoạt động tốt hơn. – Carl
@Carl, đã dùng thử chức năng lcs. Vẫn giống nhau. – Sal
Tôi nghi ngờ vấn đề là khi tất cả trong một mô-đun, GHC có thể chuyên biến kiểu 'a' thành' Char' vì nó không bao giờ được sử dụng với bất kỳ loại nào khác, loại bỏ chi phí của lớp. Bạn có thể thử chơi xung quanh với pragma 'SPECIALIZE' (hoặc chỉ thay đổi nó thành' Char' theo cách thủ công) và xem nó có hiệu lực không. – hammar