[Haskell-cafe] Optimization demonstration
Dušan Kolář
kolar at fit.vut.cz
Wed Feb 28 14:03:44 UTC 2018
Many thanks all for replies, yes, that's what I assumed/wrote. C compiler does compile-
time evaluation, while ghc does another transformation. And, well, yes, declaring
upper bound in loop in extra file breaks the optimization for C compiler and, thus, both
evaluation times for C and Haskell binaries are the same thus.
Thank you once, again,
Dušan
P.S.
If anyone can point me to resource, where examples on demonstration of Haskell
optimization are, I'll be very glad.
D.
On úterý 27. února 2018 23:06:38 CET Richard O'Keefe wrote:
> In order to optimise array indexing and to automatically vectorise
> your code, high performance compilers for imperative languages
> like C and Fortran analyse counted loops like you wouldn't believe.
> You can find out what the C compiler does with your code by using
> the -S command line option. gcc 7.2 optimised the whole loop away.
>
> Split your C program into two files.
> One contains
> long bound = 100000000L, incr = 1L;
> The other is a version of your existing code with
> extern long bound, incr;
> ...
> for (i = 1L; i <= bound; i += incr) { ... }
> ...
> gcc 7.2 isn't quite smart enough to optimise this away. Yet.
>
> The polyhedral optimisations going on are described in the
> open literature and are valuable for imperative array-
> crunching code. You are not likely to see them in GHC any
> time soon, just as you're not likely to see deforestation
> in gcc any time soon.
>
> On 28 February 2018 at 04:06, Dušan Kolář <kolar at fit.vut.cz> wrote:
> > Dear Café,
> >
> >
> >
> > I'm trying to do very small, but impressive example about optimizations
> > possible during Haskell compilation. So far, I can demonstrate that the
> > following two programs (if compiled) perform computation in the same time:
> >
> >
> >
> > 1)
> >
> >
> >
> > main =
> >
> > putStrLn $ show $ sum $ map (*(2::Int)) [(1::Int)..(100000000::Int)]
> >
> >
> >
> >
> >
> > 2)
> >
> >
> >
> > main =
> >
> > putStrLn $! show $! sumup 1 0
> >
> >
> >
> > sumup :: Int -> Int -> Int
> >
> > sumup n total =
> >
> > if n<=(100000000::Int) then sumup (n+1) $! total+(2*n)
> >
> > else total
> >
> >
> >
> >
> >
> > Nevertheless, I expect a question on comparison with C:
> >
> >
> >
> > 3)
> >
> >
> >
> > #include <stdio.h>
> >
> >
> >
> > int main(void) {
> >
> > long sum, i;
> >
> > sum = 0;
> >
> > for (i=1; i <= 100000000L; ++i) {
> >
> > sum += 2*i;
> >
> > }
> >
> > printf("%ld\n",sum);
> >
> > return 0;
> >
> > }
> >
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180228/dd231a3b/attachment.html>
More information about the Haskell-Cafe
mailing list