cl3-3.0.0.0: benchmarks/WeighStorableCl3.hs
import Weigh
import Data.Vector.Storable as V
import Data.Massiv.Array as A
import Algebra.Geometric.Cl3
import Foreign.Ptr (Ptr(), plusPtr)
import Foreign.Storable (Storable(..))
import Foreign.Marshal.Alloc (mallocBytes)
main :: IO ()
main = mainWith $ do func' "Cl3.R in Vector" apsR unitR
func' "Cl3.Cl3_R in Vector" compactR unitR
func' "Cl3.R in Massiv Vector" apsRMassiv unitR
func' "Cl3.Cl3_R in Massiv Vector" compactRMassiv unitR
action "malloc Storable Cl3_R by (1024*1024)" $ mallocR unitR
apsR :: Cl3 -> V.Vector Cl3
apsR cl3 = V.replicate (1024*1204) cl3
compactR :: Cl3 -> V.Vector Cl3_R
compactR cl3 = V.replicate (1024*1204) (toCl3_R cl3)
apsRMassiv :: Cl3 -> A.Array A.S A.Ix1 Cl3
apsRMassiv cl3 = A.makeVectorR A.S A.Seq (A.Sz1 (1024*1204)) (const cl3)
compactRMassiv :: Cl3 -> A.Array A.S A.Ix1 Cl3_R
compactRMassiv cl3 = A.makeVectorR A.S A.Seq (A.Sz1 (1024*1204)) (const $ toCl3_R cl3)
mallocR :: Cl3 -> IO (Ptr Cl3_R)
mallocR cl3 = do
pa <- mallocBytes ((1024*1204) * sizeOf (undefined :: Cl3_R))
let fill idx | idx < (1024*1204) = do
poke (pa `plusPtr` (idx * sizeOf (undefined :: Cl3_R))) cl3
fill (idx+1)
fill _ | otherwise = return ()
fill 0
peekElemOff pa (1024*1204)
unitR :: Cl3
unitR = R 1