Defining a custom newByteArray primop that uses calloc?

Brandon Simmons brandon.m.simmons at gmail.com
Tue Nov 25 20:24:53 UTC 2014


In my tests, using calloc from:

    https://hackage.haskell.org/package/missing-foreign-0.1.1/docs/Foreign-Marshal-MissingAlloc.html

was about twice as fast as allocating and zeroing the same amount of
memory with `newByteArray` + any of `copy/set/fillMutableByteArray`
(all three were nearly identical). Is there a way I can reasonably
define my own `newByteArray` that uses calloc?

FWIW here are a couple of the benchmarks I'm working with in criterion:

    arrTestSet :: Int -> IO ()
    arrTestSet len = do
        let eBytes = (P.sizeOf (undefined::Int))*len
        a <- P.newAlignedPinnedByteArray
                    eBytes
                    (P.alignment (undefined :: Int))
        void $ P.setByteArray a 0 len (1::Int)

    arrTestCallocAndWrite :: Int -> IO ()
    arrTestCallocAndWrite len = do
        ptr <- callocBytes (len*(P.sizeOf(undefined::Int))) :: IO (Ptr Int)
        pokeElemOff ptr 0 1
        free ptr

Thanks,
Brandon


More information about the Glasgow-haskell-users mailing list