[GHC] #9339: last is not a good consumer
GHC
ghc-devs at haskell.org
Mon Jul 21 08:01:27 UTC 2014
#9339: last is not a good consumer
-------------------------------------+-------------------------------------
Reporter: dfeuer | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: | Version: 7.8.3
libraries/base | Keywords:
Resolution: | Operating System: Unknown/Multiple
Differential Revisions: | Type of failure: Runtime
Architecture: | performance bug
Unknown/Multiple | Test Case:
Difficulty: Unknown | Blocking:
Blocked By: |
Related Tickets: |
-------------------------------------+-------------------------------------
Comment (by dfeuer):
Replying to [comment:1 nomeata]:
> What general fusion work are you referring to? I only know about the
improvements for fusing foldl, which doesn’t seem to apply here.
I was under the impression (possibly bogus) that the `foldl` fix involved
some new transformation that could have other effects.
> Although maybe it could. How about this definition:
>
> {{{
> myLast2 :: [a] -> a
> myLast2 = foldl (\_ x -> x) undefined
> }}}
>
> While `last` yields 800051648 bytes, and `myLast` yields 560084432
bytes, this runs in 51648 bytes (i.e. it fuses completely).
That looks wonderful. Is it certain to be changed to a `foldl'` in cases
where it ''doesn't'' fuse?
> Admitted, the resulting code looks almost stupidly efficient (at least
if I write `10^7` as `10000` – I’m unjustifiably surprised that that is
not constant-folded):
Imagine the confusion if it were! Yes, `map f [m..n] !! p` ''could'' be
optimized to O(1) whenever `m` has a known-sane type, but then all the
newbies and half the oldies would get mixed up when little changes had
radical performance impacts.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/9339#comment:2>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list