하스켈과 스칼라에는 매우 간단한 코드가 있습니다. 이 코드는 매우 엄격한 루프에서 실행되도록 설계되었으므로 성능이 중요합니다. 문제는 Haskell이 Scala보다 약 10 배 더 느리다는 것입니다. 여기는 하스켈 코드입니다.하스켈 벡터 성능이 스칼라와 비교
{-# 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
어파 인 변형을 표현하기 위해 왜 '벡터'가 필요한가요? ADT를 만들고 좌표 배열을 처리하는 것이 더 합리적 인 것처럼 보입니다. – leventov