[Haskell-cafe] Optimization demonstration

Ryan Reich ryan.reich at gmail.com
Tue Feb 27 15:37:42 UTC 2018


I thought fusion might be the answer, but don't the standard list functions
have rewrite rules for that too? Build/consume; this should apply directly
to this example (version 1).

On Feb 27, 2018 07:30, "Shao Cheng" <astrohavoc at gmail.com> wrote:

You can use Template Haskell to perform arbitrary computation at
compile-time (even if it requires IO!), and then `lift` the result into a
Haskell literal. This works for any type with a `Lift` instance (or with a
bit of trick, any serializable type).

Coming back to your use case, you may try avoid using raw lists and switch
to unboxed vectors, turn on -O2 and rely on stream fusion of the vector
package. That will result in a considerable speedup.

On Tue, Feb 27, 2018, 11:09 PM 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;
>
> }
>
>
>
>
>
> Unfortunately, in this case the C is much more faster (it prints the
> result immediately), at least on my machine. Is it due to a fact that C
> compiler does a brutal optimization leading to compile-time evaluation,
> while ghc is not able to do that?
>
>
>
> I'm using -O2 -dynamic --make ghc compiler flags. For gcc for C
> compilation just -O2, running Arch Linux.
>
>
>
> Is there any option, how to force compile time evaluation? The reason, why
> I think it works this way is the fact, that when running out of long type
> values in C a code is generated that computes the values regularly
> (providing misleading value as a result) taking its time.
>
>
>
> Best regards,
>
>
>
> Dušan
>
>
>
>
>
>
> _______________________________________________
> Haskell-Cafe mailing list
> To (un)subscribe, modify options or view archives go to:
> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
> Only members subscribed via the mailman list are allowed to post.


_______________________________________________
Haskell-Cafe mailing list
To (un)subscribe, modify options or view archives go to:
http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
Only members subscribed via the mailman list are allowed to post.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/haskell-cafe/attachments/20180227/48c8c0b9/attachment-0001.html>


More information about the Haskell-Cafe mailing list