Все еще работает над моей реализацией 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 сделает это для меня в любом случае.
Может ли кто-нибудь увидеть существенную оптимизацию, которая может быть дополнительно применена?
FYI: 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
