给出以下(煮沸和伪Haskell-ish)代码:
import qualified Data.Vector.Unboxed as V
minimum3 :: Double -> Double -> Double -> Double
minimum3 a b c | a < b | a < c = a
| otherwise = c
| otherwise | b < c = b
| otherwise c
readMinimum3 :: V.Vector Double -> Int -> Double
readMinimum3 v i = do
a <- V.unsafeRead v (i+0)
b <- V.unsafeRead v (i+1)
c <- V.unsafeRead v (i+2)
-- manually unrolled version of:
-- [a,b,c] <- sequence [V.unsafeRead v (i+j) | j <- [0..2]]
return $! minimum3 a b c
minimum3
是更大功能的代表median15
,但这个想法是一样的。所有这一切都是为了防止内存分配,实际上这个代码被编译成基本上线性的汇编程序。
我也尝试过基于vectors
的同样的事情,希望融合会消除保持读取值的中间向量,但没有运气。
问题是,是否有办法以更易于维护的方式编写此内容而无需手动展开该内容?