我在 Haskell 和 Scala 中有一段非常简单的代码。此代码旨在以非常紧密的循环运行,因此性能很重要。问题是 Haskell 比 Scala 慢大约 10 倍。这是 Haskell 代码。
{-# LANGUAGE BangPatterns #-}
import qualified Data.Vector.Unboxed as VU
newtype AffineTransform = AffineTransform {get :: (VU.Vector Double)} deriving (Show)
{-# INLINE runAffineTransform #-}
runAffineTransform :: AffineTransform -> (Double, Double) -> (Double, Double)
runAffineTransform affTr (!x, !y) = (get affTr `VU.unsafeIndex` 0 * x + get affTr `VU.unsafeIndex` 1 * y + get affTr `VU.unsafeIndex` 2,
get affTr `VU.unsafeIndex` 3 * x + get affTr `VU.unsafeIndex` 4 * y + get affTr `VU.unsafeIndex` 5)
testAffineTransformSpeed :: AffineTransform -> Int -> (Double, Double)
testAffineTransformSpeed affTr count = go count (0.5, 0.5)
where go :: Int -> (Double, Double) -> (Double, Double)
go 0 res = res
go !n !res = go (n-1) (runAffineTransform affTr res)
还可以做些什么来改进此代码?