# possible tuple elimination optimization?

Simon Peyton Jones simonpj at microsoft.com
Tue Mar 29 10:24:49 UTC 2016

```Yes: see https://ghc.haskell.org/trac/ghc/wiki/NestedCPR

Simon

| -----Original Message-----
| From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of Dan Doel
| Sent: 26 March 2016 20:41
| To: George Colpitts <george.colpitts at gmail.com>
| Subject: Re: possible tuple elimination optimization?
|
| By the way, in case this helps your mental model, if you modify sumr to be:
|
|     sumr n = snd \$ as' 1 0
|       where
|       as' i s
|         | i >= n = (i, s)
|         | otherwise = ...
|
| Then it has the same problem as sumh. Your original as' for sumr is
| strict in s, but this modified one isn't.
|
| This shows another way to fix sumh, too. Create a version of until
| that separates out the part of the state that is only for testing.
| Then the until loop will be strict in the result part of the state,
| and the desired optimizations will happen (in this case):
|
|     until' p step = go
|      where
|      go t r
|        | p t = r
|        | otherwise = uncurry go \$ step (t, r)
|
| -- Dan
|
| On Sat, Mar 26, 2016 at 1:50 PM, George Colpitts
| <george.colpitts at gmail.com> wrote:
| > The following higher order function, sumh, seems to be 3 to 14 times slower
| > than the equivalent recursive function, sumr:
| >
| > sumh :: Double -> Double
| > sumh n =
| >     snd \$ until ((>= n) . fst) as' (1, 0)
| >     where
| >       as' (i,s) =
| >           (i + 2, s + (-1) / i + 1 / (i + 1))
| >
| > sumr :: Double -> Double
| > sumr n =
| >     as' 1 0
| >     where
| >       as' i  s
| >           | i >= n    = s
| >           | otherwise = as' (i + 2) (s + (-1) / i + 1 / (i + 1))
| >
| > This is true in 7.10.3 as well as 8.0.1 so this is not a regression. From
| > the size usage my guess is that this is due to the allocation of tuples in
| > sumh. Maybe there is a straightforward way to optimize sumh but I couldn't
| > find it. Adding a Strict pragma didn't help nor did use of
| > -funbox-strict-fields -flate-dmd-anal. Have I missed something or should I
| > file a bug?
| >
| > Timings from 8.0.1 rc2:
| >
| > ghc --version
| > The Glorious Glasgow Haskell Compilation System, version 8.0.0.20160204
| > bash-3.2\$ ghc -O2 -dynamic sum.hs
| > ghc -O2 -dynamic sum.hs
| > [1 of 1] Compiling Main             ( sum.hs, sum.o )
| > bash-3.2\$ ghci
| > Ok, modules loaded: Main.
| > (0.05 secs,)
| > Prelude Main> sumh (10^6)
| > -0.6931466805602525
| > it :: Double
| > (0.14 secs, 40,708,016 bytes)
| > Prelude Main> sumr (10^6)
| > -0.6931466805602525
| > it :: Double
| > (0.01 secs, 92,000 bytes)
| >
| > Thanks
| > George
| >
| > _______________________________________________
| > ghc-devs mailing list
| >
| org%2fcgi-bin%2fmailman%2flistinfo%2fghc-
| devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7cec78251e0f564b23014708
| d355b6ed56%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=7u50FvyHKPpAXiweli%2b
| 0CP1pup15X8Kh9rN8JrIXP78%3d
| >
| _______________________________________________
| ghc-devs mailing list