[Haskell-cafe] Floyd Warshall performance (again)

Mathieu Boespflug mboes at tweag.net
Fri Apr 16 11:59:31 EDT 2010


Hi John,

your transformation on the original program amounts to replacing all
occurrences of a Haskell literal with a Haskell variable. You will
therefore end up with something that looks like this :

loop sIZE = return ()
loop j = ...

sIZE is now a pattern variable, that is, the pattern of the first
clause is irrefutable, so all calls to loop will return immediately.
What you were probably looking for is:

loop j | j == sIZE = return ()
       | otherwise = ...

-- Mathieu


On Fri, Apr 16, 2010 at 04:41:06PM +0100, John Lato wrote:
> > From: Mathieu Boespflug <mboes at tweag.net>
> >
> > Dear haskell-cafe,
> >
> > I implemented the Floyd Warshall algorithm for finding the shortest
> > path in a dense graph in Haskell, but noted the performance was
> > extremely poor compared to C. Even using mutable unboxed arrays it was
> > running about 30 times slower. I rewrote the program several times, to
> > arrive at the following definition:
> >
> 
> My results are basically the same as Max's, but if I change
> 
> > #define SIZE 1500
> to
> > sIZE = 1500
> 
> and all references from "SIZE" to "sIZE", something ... changes.  A lot.
> 
> MacBook-1:Desktop johnlato$ time ./FW
> Allocating ...
> Allocating ... done
> 
> real	0m0.027s
> user	0m0.013s
> sys	0m0.014s
> 
> I can't figure this out at all.  Can anyone else confirm, or offer a
> good explanation?
> 
> John


More information about the Haskell-Cafe mailing list