Yo, I don't know if this helps, but I can create arbitrary compilation times with very small code samples: let sink (a,f) = f a let base = () let finish () = () let step () = () let fold (a,f) g = g (a,f) let step0 h (a,f) = fold (h a,f) let f z = fold (base, finish) z let a z = step0 step z let () =   let () = f     a a a a     a a a a     a a a a     a a a a     a a a a     a a a     sink   in   ();; $> time ocamlc vararg.ml real    1m9.372s user    1m9.264s sys    0m0.044s Try adding a few a's and see what that gives. have fun, Romain. PS I'm quite clueless about what's going on exactly. I just stumbled onto this tinkering around with MLton's fold vararg solutions.