[Haskell-cafe] looking for optimization advice
Simon Marlow
simonmar at microsoft.com
Mon Mar 29 15:55:40 EST 2004
> I think that adding the extra check to see if the pointers
> are identical
> sped this up enough that it's probably no longer a major
> issue--I'm pretty
> certain that the problem was large strings that were
> identical, so every
> byte had to be checked, so probably scary non-portable home-made
> ForeignPtrs would not be worth the effort. (Although I'm
> somewhat curious as to how it would be done...)
A ForeignPtr allocated with mallocForeignPtr in GHC is heap-allocated
garbage-collectable storage, and doesn't need a finalizer. The other
kind of ForeignPtr created with newForeignPtr is associated with some
external storage and needs a finalizer. Finalizers are expensive, and
so is malloc(), but mallocForeignPtr is very cheap.
This gives rise to a sum-type in the implementation of ForeignPtr: see
the source code (libraries/base/GHC/ForeignPtr.hs). You could make a
specialised version by ripping out the non-malloc ForeignPtr bits, and
make an unboxable ForeignPtr type.
A mallocForeignPtr-style ForeignPtr is essentially the same as an
IOUArray. In fact, the underlying implementation type is the same
(MutableByteArray#), except that a ForeignPtr is allocated in pinned
(immovable) storage so that it can be passed to foreign functions.
There could easily be a conversion from a "malloc" ForeignPtr to
IOUArray.
There is also some overlap with the StorableArray type. A StorableArray
has a ForeignPtr inside it.
It really looks like the framework could be simplified here, but I
remember putting some thought into it and not coming up with a simple
solution.
Cheers,
Simon
More information about the Haskell-Cafe
mailing list