Cheap ForeignPtr allocation

Simon Marlow simonmar at microsoft.com
Mon Sep 2 11:48:24 EDT 2002


Hi Folks,

I'd like to propose two new functions for the ForeignPtr interface:

	mallocForeignPtr      :: Storable a => IO (ForeignPtr a)
      mallocForeignPtrBytes :: Int -> IO (ForeignPtr a)

(the names can change, of course).  The implementations are trivial in
terms of existing things:

    mallocForeignPtr = do
      p <- malloc
      newForeignPtr p free

    mallocForeignPtrBytes size = do
      p <- mallocBytes size
      newForeignPtr p free

However, in GHC we can provide a far more efficient implementation by
using pinned ByteArray#s, avoiding the overhead of malloc()/free() and
the finalizer.  Since this is quite a common idiom when using
ForeignPtrs, I think it's a good case to optimise.

I did a little test, and using the above functions gave a 6x improvement
in a small example which just repeatedly allocated a new ForeignPtr and
passed it to a foreign function.

The GHC implementation is to extend the ForeignPtr type like this:

  data ForeignPtr a 
    = ForeignPtr ForeignObj#
    | MallocPtr  (MutableByteArray# RealWorld)

so it does in theory slow down normal ForeignPtrs slightly, but I didn't
measure any difference in the limited tests I did.

Comments?

Cheers,
	Simon




More information about the FFI mailing list