
#10788: performance regression involving minimum -------------------------------------+------------------------------------- Reporter: rwbarton | Owner: ekmett Type: bug | Status: new Priority: normal | Milestone: Component: Core Libraries | Version: 7.10.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime | Unknown/Multiple performance bug | Test Case: Blocked By: | Blocking: Related Tickets: | Differential Revisions: -------------------------------------+------------------------------------- Comment (by nomeata):
In this particular case, I am quite happy with the INLINEABLE/SPECIALIZE solution, and will submit a DR soon.
Spoke too soon. Looking at the core of `List`, the `maximum` for `Int` is
great (worker with a strict unboxed `Int`), but for `Integer`, the
strictness analyzer is failing me, and I get this loop:
{{{#!hs
Rec {
-- RHS size: {terms: 12, types: 8, coercions: 0}
maximum_go [Occ=LoopBreaker] :: [Integer] -> Integer -> Integer
[GblId, Arity=2, Caf=NoCafRefs, Str=DmdType ]
maximum_go =
\ (ds_a2d4 :: [Integer]) (eta_B1 :: Integer) ->
case ds_a2d4 of _ [Occ=Dead] {
[] -> eta_B1;
: y_a2d9 ys_a2da ->
maximum_go
ys_a2da
(integer-gmp-1.0.0.0:GHC.Integer.Type.$fOrdInteger_$cmax
eta_B1 y_a2d9)
}
end Rec }
}}}
So it sees that `go` is strict in its second argument. Why is it then not
strictly evaluated before the recursive call, avoiding this obvious space
leak?
Note that `max` is not inlined (as it is for Int), but the strictness data
is there, so that should not make a difference.
Anyways, I guess this discussion is derailing for this particular ticket.
I’ll look into a combination of rewriting with `RULES` to `strictMinimum`
to avoid relying on the strictness analyzer to produce good code.
--
Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/10788#comment:10
GHC http://www.haskell.org/ghc/
The Glasgow Haskell Compiler