[Haskell-cafe] Global Arrays
Clark Gaebel
cgaebel at csclub.uwaterloo.ca
Fri Mar 9 21:48:59 CET 2012
In Haskell, what's the canonical way of declaring a top-level array
(Data.Vector of a huge list of doubles, in my case)? Performance is
key in my case.
The straightforward way would just be something like:
globalArray :: V.Vector Double
globalArray = V.fromList [ huge list of doubles ]
{-# NOINLINE globalArray #-}
However, I don't want to have to run the fromList at runtime. Not only
would this mean a bigger executable (having to store a linked list,
instead of an array), it would be quite inefficient since we don't
even use the source list!
Therefore, I was thinking of storing the array in a C file:
static const double globalArray[] = { huge list of doubles };
double* getGlobalArray() { return globalArray; }
int getGlobalArraySize() { return
sizeof(globalArray)/sizeof(globalArray[0]); }
And importing it in haskell witht he FFI, followed with an unsafeCast:
foreign import ccall unsafe "getGlobalArray" c_globalArray :: Ptr CDouble
foreign import ccall unsafe "getGlobalArraySize" c_globalArraySize :: CInt
globalArray :: V.Vector Double
globalArray = V.unsafeCast $ unsafeFromForeignPtr0 (unsafePerformIO $
newForeignPtr_ c_globalArray) (fromIntegral c_globalArraySize)
{-# NOINLINE globalArray #-}
But this version (clearly) is full of "unsafe"ty. Is there a better
way that I haven't thought of?
Regards,
- clark
More information about the Haskell-Cafe
mailing list