<div dir="ltr"><div>Hi,</div><div><br></div><div>I used to think that the policy for being eligible for -O1 is that C must be non-positive, e.g. that the compile times don't suffer at all. Everything beyond that (well, given that R is positive) should be -O2 only.</div><div>There's precedent at least for Late Lambda Lifting (which is only run for -O2) here: <a href="https://phabricator.haskell.org/D5224#147959">https://phabricator.haskell.org/D5224#147959</a>.</div><div>Upon re-reading I see that Simon Marlow identified C=1 as the hard threshold. Maybe there are other cases as well?</div><div><br></div><div>Personally, I like C=0 for the fact that it means the compiler will only get faster over time. And any reasonably tuned release executable will do -O2 anyway.</div><div><br></div><div>Cheers,</div><div>Sebastian<br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Am Di., 27. Aug. 2019 um 17:11¬†Uhr schrieb Andreas Klebinger <<a href="mailto:klebinger.andreas@gmx.at">klebinger.andreas@gmx.at</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello ghc-devs and haskell users.<br>
<br>
I'm looking for opinions on when an optimization should be enabled by<br>
default.<br>
<br>
-O is currently the base line for an optimized build.<br>
-O2 adds around 10-20% compile time for a few % (around 2% if I remember<br>
correctly) in performance for most things.<br>
<br>
The question is now if I implement a new optimization, making code R%<br>
faster but slowing<br>
down the compiler down by C% at which point should an optimization be:<br>
<br>
* Enabled by default (-O)<br>
* Enabled only at -O2<br>
* Disabled by default<br>
<br>
Cheap always beneficial things make sense for -O<br>
Expensive optimizations which add little make sense for -O2<br>
<br>
But where exactly is the line here?<br>
How much compile time is runtime worth?<br>
<br>
If something slows down the compiler by 1%/2%/5%<br>
and speeds up code by 0.5%/1%/2% which combinations make sense<br>
for -O, -O2?<br>
<br>
Can there even be a good policy with the -O/-O2 split?<br>
<br>
Personally I generally want code to either:<br>
* Typecheck/Run at all (-O0, -fno-code, repl)<br>
* Not blow through all my RAM when adding a few Ints while developing: -O ?<br>
* Make a reasonable tradeoff between runtime/compiletime: -O ?<br>
* Give me all you got: -O2 (-O99999)<br>
<br>
The use case for -O0 is rather clear, so is -O2.<br>
But what do people consider the use case for -O<br>
<br>
What trade offs seem acceptable to you as a user of GHC?<br>
<br>
Is it ok for -O to become slower for faster runtimes? How much slower?<br>
Should all new improvements which might slow down compilation<br>
be pushed to -O2?<br>
<br>
Or does an ideal solution add new flags?<br>
Tell me what do you think.<br>
<br>
Cheers,<br>
Andreas Klebinger<br>
<br>
_______________________________________________<br>
ghc-devs mailing list<br>
<a href="mailto:ghc-devs@haskell.org" target="_blank">ghc-devs@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs</a><br>
</blockquote></div>