to handle the 2d indexing, i replaced readArray m (i,j) by readMatrix m (i,j):
{-# INLINE readMatrix #-}
readMatrix m ij = unsafeRead m (unsafeIndex matrixBounds ij)
matrixBounds :: ((Int,Int),(Int,Int))
matrixBounds = ((1,1),(n,n))
i'm still trying to understand why unsafeIndex is so much faster than index.
to prepare for further experiments, i tried to include the default
implementation
for method index in my source (which includes all the other optimisations
discussed
here), as myindex:
{-# INLINE readMatrix #-}
readMatrix m ij = unsafeRead m (index matrixBounds ij)
myindex b i | inRange b i = unsafeIndex b i
| otherwise = error "Error in array index"
now, the measurement that confuses me is this:
time ./CG array 100000
readMatrix calls index: 16s
readMatrix calls myindex: 9s
so just calling an in-module copy of the default code for index, with
bounds-check,
is almost as fast as calling unsafeIndex, and almost twice as fast as calling
the official
index..
can anyone explain this effect?
claus
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe