如何防止不可滚动代码中的分配?

时间:2017-02-24 13:53:31

标签: haskell

给出以下(煮沸和伪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的同样的事情,希望融合会消除保持读取值的中间向量,但没有运气。

问题是,是否有办法以更易于维护的方式编写此内容而无需手动展开该内容?

0 个答案:

没有答案