Оптимизация внутренних циклов Haskell

Я все еще работаю над своей реализацией SHA1 в Haskell . Теперь у меня есть рабочая реализация, и это внутренний цикл:

iterateBlock' :: Int -> [Word32] -> Word32 -> Word32 -> Word32 -> Word32 -> Word32 -> [Word32]
iterateBlock' 80 ws a b c d e    = [a, b, c, d, e]
iterateBlock' t (w:ws) a b c d e = iterateBlock' (t+1) ws a' b' c' d' e'
    where
    a' = rotate a 5 + f t b c d + e + w + k t
    b' = a
    c' = rotate b 30
    d' = c
    e' = d

Профилировщик сообщает мне, что эта функция занимает 1/3 времени выполнения моей реализации. Я не могу придумать никакого способа его дальнейшей оптимизации, кроме, возможно, встраивания временных переменных, но я верю, что -O2 все равно сделает это за меня.

Может ли кто-нибудь увидеть значительную оптимизацию, которую можно применить в дальнейшем?

К вашему сведению, вызовы k и f приведены ниже. Они настолько просты, что я не думаю, что есть способ их оптимизировать. Если модуль Data.Bits не работает медленно?

f :: Int -> Word32 -> Word32 -> Word32 -> Word32
f t b c d
    | t <= 19   = (b .&. c) .|. ((complement b) .&. d)
    | t <= 39   = b `xor` c `xor` d
    | t <= 59   = (b .&. c) .|. (b .&. d) .|. (c .&. d)
    | otherwise = b `xor` c `xor` d

k :: Int -> Word32
k t
    | t <= 19   = 0x5A827999
    | t <= 39   = 0x6ED9EBA1
    | t <= 59   = 0x8F1BBCDC
    | otherwise = 0xCA62C1D6
10
задан Ana 14 November 2011 в 21:50
поделиться