[Yhc] Yhc: A second impression
Thorkil Naur
naur at post11.tele.dk
Tue Feb 13 17:36:12 EST 2007
Hello Yhc'ers,
With the correction of bug #18
http://code.google.com/p/yhc/issues/detail?q=&can=2&id=18
I have been able to use Yhc to run a number of my "serious" toy programs,
solving important problems like SuDoku puzzles or finding prime factors of
large integers.
Congratulations, this is most satisfactory.
I have a simple benchmark that I have run many times, mostly to compare the
performance of different machines. The benchmark consists of running a single
program t3 compiled using GHC and measure its CPU usage. This program
performs some rather long-winding computations involving large (35-70 decimal
digit) numbers that conclude in discovering the second-largest prime factor
1963506722254397 of the "repunit" R[43] = (10^43-1)/9 = 111...(total of 43
1's)...1.
On a slow machine that I have used a lot, this takes about 3.5 minutes. On a
fast machine, it takes less than 3 seconds.
But t3 can, of course, also be used to compare different Haskell
implementations on the same machine. So, I have run the following script on
my PPC Mac OS X 10.4:
#!/bin/sh
# t3timing1.sh: Timing t3.hs using GHC, Hugs, Yhc
# 2007-Feb-13 19.11 / TN
do_ghc () {
echo $0: GHC $*
time ghc-inplace --make t3.hs $*
time ./t3
rm *.hi *.o t3
}
ghc-inplace --version
time echo :q | ghc-inplace --interactive t3
time echo main | ghc-inplace --interactive t3
do_ghc -O0
do_ghc -O1
do_ghc -O2
time echo :q | hugs t3
time echo main | hugs t3
time yhc t3
time yhi Main
rm *.hi *.hbc
Essentially, this runs t3 using 4 variants of GHC-support (interpreted and
-O0..2) and a single variant of each of Hugs and Yhc. The output, with some
non-essentials left out, is:
The Glorious Glasgow Haskell Compilation System, version 6.7.20070209
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.7.20070209, for Haskell
98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Loading package base ... linking ... done.
[ 1 of 47] Compiling FtdBase ( FtdBase.hs, interpreted )
...
[47 of 47] Compiling Main ( t3.hs, interpreted )
Ok, modules loaded: ...
*Main> Leaving GHCi.
real 0m25.956s
user 0m20.449s
sys 0m1.029s
___ ___ _
/ _ \ /\ /\/ __(_)
/ /_\// /_/ / / | | GHC Interactive, version 6.7.20070209, for Haskell
98.
/ /_\\/ __ / /___| | http://www.haskell.org/ghc/
\____/\/ /_/\____/|_| Type :? for help.
Loading package base ... linking ... done.
[ 1 of 47] Compiling FtdBase ( FtdBase.hs, interpreted )
...
[47 of 47] Compiling Main ( t3.hs, interpreted )
Ok, modules loaded: ...
*Main> Loading package haskell98 ... linking ... done.
t3: 2007-Feb-13 20.08
t3I_20: fecFactorList [6..105] r43r 1300 4300 1
t3I_20: (1963506722254397,"(1297,4297,[(77,ECUndefined {ecd =
1963506722254397})])")
*Main> Leaving GHCi.
real 2m4.864s
user 1m55.500s
sys 0m2.099s
t3_timing1.sh: GHC -O0
[ 1 of 47] Compiling FtdBase ( FtdBase.hs, FtdBase.o )
...
[47 of 47] Compiling Main ( t3.hs, t3.o )
Linking t3 ...
real 1m7.438s
user 0m52.395s
sys 0m4.777s
t3: 2007-Feb-13 20.08
t3I_20: fecFactorList [6..105] r43r 1300 4300 1
t3I_20: (1963506722254397,"(1297,4297,[(77,ECUndefined {ecd =
1963506722254397})])")
real 0m22.225s
user 0m21.242s
sys 0m0.348s
t3_timing1.sh: GHC -O1
[ 1 of 47] Compiling FtdBase ( FtdBase.hs, FtdBase.o )
...
[47 of 47] Compiling Main ( t3.hs, t3.o )
Linking t3 ...
real 1m30.559s
user 1m15.897s
sys 0m5.035s
t3: 2007-Feb-13 20.08
t3I_20: fecFactorList [6..105] r43r 1300 4300 1
t3I_20: (1963506722254397,"(1297,4297,[(77,ECUndefined {ecd =
1963506722254397})])")
real 0m20.557s
user 0m19.279s
sys 0m0.283s
t3_timing1.sh: GHC -O2
[ 1 of 47] Compiling FtdBase ( FtdBase.hs, FtdBase.o )
...
[47 of 47] Compiling Main ( t3.hs, t3.o )
Linking t3 ...
real 1m35.578s
user 1m20.963s
sys 0m5.178s
t3: 2007-Feb-13 20.08
t3I_20: fecFactorList [6..105] r43r 1300 4300 1
t3I_20: (1963506722254397,"(1297,4297,[(77,ECUndefined {ecd =
1963506722254397})])")
real 0m20.122s
user 0m19.182s
sys 0m0.306s
__ __ __ __ ____ ___ _________________________________________
|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005
||---|| ___|| World Wide Web: http://haskell.org/hugs
|| || Bugs: http://hackage.haskell.org/trac/hugs
|| || Version: 20070105 _________________________________________
Haskell 98 mode: Restart with command line option -98 to enable extensions
Type :? for help
Main> [Leaving Hugs]
real 0m3.336s
user 0m1.609s
sys 0m0.924s
__ __ __ __ ____ ___ _________________________________________
|| || || || || || ||__ Hugs 98: Based on the Haskell 98 standard
||___|| ||__|| ||__|| __|| Copyright (c) 1994-2005
||---|| ___|| World Wide Web: http://haskell.org/hugs
|| || Bugs: http://hackage.haskell.org/trac/hugs
|| || Version: 20070105 _________________________________________
Haskell 98 mode: Restart with command line option -98 to enable extensions
Type :? for help
Main> t3: 2007-Feb-13 20.08
t3I_20: fecFactorList [6..105] r43r 1300 4300 1
t3I_20: (1963506722254397,"(1297,4297,[(77,ECUndefined {ecd =
1963506722254397})])")
Main> [Leaving Hugs]
real 5m45.012s
user 5m37.656s
sys 0m3.116s
Nothing derived for Id 424 at nopos
Nothing derived for Id 451 at nopos
Nothing derived for Id 335 at nopos
Compiling IntMath ( IntMath.hs )
...
Compiling Main ( t3.hs )
real 1m5.848s
user 1m0.264s
sys 0m1.894s
t3: 2007-Feb-13 20.08
t3I_20: fecFactorList [6..105] r43r 1300 4300 1
t3I_20: (1963506722254397,"(1297,4297,
[(77,ECUndefined{ecd=1963506722254397})])")
real 5m36.540s
user 5m29.788s
sys 0m2.544s
From this, -O2 GHC execution is about 19 seconds, Hugs execution is 5 minutes
and 41 seconds (341 seconds) (including compilation, about 3 seconds), and
Yhi execution is 5 minutes and 31 seconds (331 seconds).
Overall: For this program (t3), Hugs and Yhc execution times are comparable.
Compiled GHC -O2 is 17 times faster.
Best regards
Thorkil
More information about the Yhc
mailing list