我在Haskell和Scala中有一段非常简单的代码。此代码旨在以非常严格的循环运行,因此性能很重要。问题是Haskell比Scala慢10倍左右。这里是Haskell代码。Haskell矢量性能与Scala相比
{-# 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)
还可以做些什么来改进此代码?
你是如何编译它以及使用哪个编译器的? –
它是用ghc 7.6.3编译的。选项是“-O2-Wall -funbox-strict-fields -threaded -rtsopts”。我期望-funbox-strict-fields就足够了,但事实并非如此。那么,我是一个完整的新手,所以我的期望可能会有所改变。 – Aurimas
为什么你需要'Vector'来表示仿射变换?为它制作ADT并处理坐标数组似乎更合理。 – leventov