Posted at

Data.Vector.UnboxedとData.Vector.Storableの速度比較

More than 3 years have passed since last update.

高速処理が必要なデータ解析ソフトウェアパッケージを開発している関係でいろいろなデータ列の処理速度を調べている。ベクトル演算や行列演算処理が整っているhmatrixを用いることが多く、そのVector型の効率をData.Vector.Unboxedと比較してみた。

hmatrixのVector型のご本尊はData.Vector.Storableなので、結局はそれとの比較になる。

以下が評価に用いたコード

-- testSpeedVector.hs

import qualified Data.Vector.Unboxed as UV
import qualified Data.Vector.Storable as SV
import Data.Time
import System.Random

main = do
let x = take 10000000 $ randomRs (-10, 10) $ mkStdGen 1 :: [Double]

t1 <- getCurrentTime
-- for Data.Vector.Unboxed
print $ UV.head $ UV.reverse $ UV.fromList x
t2 <- getCurrentTime
print $ diffUTCTime t2 t1

t3 <- getCurrentTime
-- for Data.Vector.Storable
print $ SV.head $ SV.reverse $ SV.fromList x
t4 <- getCurrentTime
print $ diffUTCTime t4 t3

これを

ghc --make testSpeedVector.hs

でコンパイルし、実行してみたところ、

-3.0045005415246084

25.137353s

-3.0045005415246084

0.575353s

と、約50倍ほどData.VectorStorableの方が速くなってしまった。

完全に予想外である。せいぜいコンマ何秒の差かと予想していたのだが。

どこでこんなどでかい差が生まれているのだろう???