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@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@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.