| I'm compiling with -O2 -Wall.  After looking at the Core output, I
| think I've found the key difference.  A function that is bound in a
| "where" statement is different between the monolithic and split
| sources.  I have no idea why, though.  I'll experiment with a few
| different things to see if I can get this resolved.

In general, splitting code across modules should not make programs less 
efficient -- as Don says, GHC does quite aggressive cross-module inlining.

There is one exception, though.  If a non-exported non-recursive function is 
called exactly once, then it is inlined *regardless of size*, because doing so 
does not cause code duplication.  But if it's exported and is large, then its 
inlining is not exposed -- and even if it were it might not be inlined, because 
doing so duplicates its code an unknown number of times.  You can change the 
threshold for (a) exposing and (b) using an inlining, with flags 
-funfolding-creation-threshold and -funfolding-use-threshold respectively.

If you find there's something else going on then I'm all ears.

Simon
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to