Haskell'de büyük tamsayı matrislerinin satırlarını sıralamak zorundayım ve rasgele verilerle kıyaslamaya başladım. Haskell'in C++'dan 3 kat daha yavaş olduğunu buldum.Haskell: matris sıralama vektör sıralamadan çok daha yavaş
Rasgelelikten dolayı, satırın her zaman ilk sütunda sonlandırılmasını beklerim (bu, çoğaltmaları olmamalıdır). Bu yüzden, Matrix'i Vector (Unboxed.Vector Int) olarak uygulanan tek bir sütuna daraltdım ve sıralamasını Normal Vector Int'le karşılaştırdım.
Vektör Int C++ (iyi haber!) Kadar hızlı bir şekilde sıralar, ancak yine sütun matrisi 3 kat daha yavaştır. Neden bir fikrin var mı? Lütfen aşağıdaki kodu bulun. İçin
import Control.Monad.Primitive
import Data.Primitive.ByteArray
import qualified Data.Vector.Generic.Mutable.Base as GM(MVector(..))
import GHC.Prim
data MutableArrayArray s a = MutableArrayArray (MutableArrayArray# s)
instance GM.MVector MutableArrayArray ByteArray where
{-# INLINE basicLength #-}
basicLength (MutableArrayArray marr) = I# (sizeofMutableArrayArray# marr)
{-# INLINE basicUnsafeRead #-}
basicUnsafeRead (MutableArrayArray marr) (I# i) = primitive $ \s -> case readByteArrayArray# marr i s of
(# s1, bar #) -> (# s1, ByteArray bar #)
{-# INLINE basicUnsafeWrite #-}
basicUnsafeWrite (MutableArrayArray marr) (I# i) (ByteArray bar) = primitive $ \s ->
(# writeByteArrayArray# marr i bar s,() #)
: Bir ArrayArray#
olarak vektörlerin bir vektör uygulayan dfeuer tavsiyelerine uyarak
import qualified Data.Vector.Unboxed as UV(Vector, fromList)
import qualified Data.Vector as V(Vector, fromList, modify)
import Criterion.Main(env, bench, nf, defaultMain)
import System.Random(randomIO)
import qualified Data.Vector.Algorithms.Intro as Alg(sort)
randomVector :: Int -> IO (V.Vector Int)
randomVector count = V.fromList <$> mapM (\_ -> randomIO) [1..count]
randomVVector :: Int -> IO (V.Vector (UV.Vector Int))
randomVVector count = V.fromList <$> mapM (\_ -> do
x <- randomIO
return $ UV.fromList [x]) [1..count]
benchSort :: IO()
benchSort = do
let bVVect = env (randomVVector 300000) $ bench "sortVVector" . nf (V.modify Alg.sort)
bVect = env (randomVector 300000) $ bench "sortVector" . nf (V.modify Alg.sort)
defaultMain [bVect, bVVect]
main = benchSort
Sadece boks olabilir. C++ içinde çok boyutlu bir diziden ziyade tek tek ayrılmış satırlar için bir dizi işaretçi olarak deneyin (burada varsayarak) ve karşılaştırın. Çok boyutlu vektörlerin desteklendiğini sanmıyorum, eğer bu devam ederse, matrisleri n * m boyutunda vektörler olarak temsil etmek için küçük bir soyutlama çalışması yapmanız gerekecektir. – luqui
@luqui üzerinde bina, C++ çok boyutlu diziler hala bellekte bir bitişik blok ise burada kutulu olmayan vektörlere referanslar bir vektör var. ['Array'] (https://hackage.haskell.org/package/array) veya [' repa'] 'yı kullandıysanız (https://hackage.haskell.org/package) çok daha iyi bir performans elde edeceğinizi umuyorum./rEPA),. – Alec
Std :: vector> ile karşılaştırdığımızda C++ 'da, yani Haskell'deki Vector (Vector Int) ile aynıdır, yani vektörlerin göstergelerinin bir vektörü. Matrisimi n * m boyutunda bir Vektör Int olarak paketlemeyi düşündüm, ama sonra bir kerede Int'lerin bloklarını değiştirebilecek hiçbir türüm yok. Ve bu blok takasına sahip olsam bile, sanırım işaretleyicileri vektörlere ayırmaktan (bellekte çok fazla yazma) daha az verimli olur. –