
Am Montag, 29. Oktober 2007 13:49 schrieb Dusan Kolar:
Hello all,
just to compare the stuff, I get quite other results being on other OS. Thus, the result of C++ compiler may not be that interesting as I do not have the one presented below.
Just to chime in, my results with the code below: dafis@linux:~> uname -a Linux linux 2.4.20-4GB-athlon #1 Mon Mar 17 17:56:47 UTC 2003 i686 unknown unknown GNU/Linux on a 1200 MHz Duron g++ is version 3.3, C++ code compiled with -O3, Haskell with -O2 (GHC 6.6.1) dafis@linux:~> time ./mainC 6 28 496 8128 real 0m1.945s user 0m1.910s sys 0m0.010s dafis@linux:~> time ./mainInt [6,28,496,8128] real 0m2.407s user 0m2.300s sys 0m0.010s dafis@linux:~> time ./mainInt64 [6,28,496,8128] real 0m24.009s user 0m23.900s sys 0m0.050s dafis@linux:~> time ./mainInteger [6,28,496,8128] real 0m21.555s user 0m20.870s sys 0m0.010s So Int is not so much slower than C, Int64 and Integer dramatically slower with Integer beating Int64 here, too. Cheers, Daniel
My machine: Linux 2.6.23-ARCH #1 SMP PREEMPT Mon Oct 22 12:50:26 CEST 2007 x86_64 Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz GenuineIntel GNU/Linux
Compilers: g++ --version g++ (GCC) 4.2.2 Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ghc --version The Glorious Glasgow Haskell Compilation System, version 6.6.1
Measurement: compiled with ghc -O2 time ./mainInteger real 0m4.866s user 0m4.843s sys 0m0.020s
compiled with ghc -O2 time ./mainInt64 real 0m2.213s user 0m2.210s sys 0m0.003s
compiled with ghc -O2 time ./mainInt real 0m1.149s user 0m1.143s sys 0m0.003s
compiled with g++ -O3 time ./mainC real 0m0.271s user 0m0.270s sys 0m0.000s
I don't know what is the reason, but the difference between Int, Int64 and Integer is not that dramatic as in example below, nevertheless, the difference between GHC and GNU C++ is very bad.... :-\
Dusan
The code:
% cat b.hs module Main (divisors, perfect, main) where import Data.Int
divisors :: Int -> [Int] divisors i = [j | j<-[1..i-1], i `rem` j == 0]
perfect :: [Int] perfect = [i | i<-[1..10000], i == sum (divisors i)]
main = print perfect
% cat b.cpp #include <iostream> using namespace std;
int main() { for (int i = 1; i <= 10000; i++) { int sum = 0; for (int j = 1; j < i; j++) if (i % j == 0) sum += j; if (sum == i) cout << i << " "; } return 0; }
%