Re: [Haskell-cafe] Ghc: -O harmful?

2009-04-06 Thread Don Stewart
-fno-state-hack?

xofon:
 
  Hello all,
 
  I have a haskell program that runs an order of magnitude slower
 when compiled with optimisations turned on.  This happens on 6.8.2
 as well as 6.10.1:
 
 
 p...@r4at184:/tmp[1]% ghc --make -fforce-recomp -o out buga.hs   
 [1 of 1] Compiling Main ( buga.hs, buga.o )
 Linking out ...
 p...@r4at184:/tmp% time ./out  3-med.in |/dev/null
 ./out  3-med.in | /dev/null  0,03s user 0,00s system 99% cpu 0,038 total
 
 p...@r4at184:/tmp% ghc --make -fforce-recomp -o out buga.hs -O
 [1 of 1] Compiling Main ( buga.hs, buga.o )
 Linking out ...
 p...@r4at184:/tmp% time ./out  3-med.in |/dev/null
 ./out  3-med.in | /dev/null  0,99s user 0,01s system 99% cpu 1,001 total
 
 p...@r4at184:/tmp[1]% ghc --make -fforce-recomp -o out buga.hs -O2
 [1 of 1] Compiling Main ( buga.hs, buga.o )
 Linking out ...
 p...@r4at184:/tmp% time ./out  3-med.in |/dev/null
 ./out  3-med.in | /dev/null  0,99s user 0,01s system 99% cpu 1,004 total
 
 p...@r4at184:/tmp% ghc --version
 The Glorious Glasgow Haskell Compilation System, version 6.8.2
 
 
 psxx:/tmp$ ghc --make -fforce-recomp -o out buga.hs   
 [1 of 1] Compiling Main ( buga.hs, buga.o )
 Linking out ...
 psxx:/tmp$ time ./out  3-med.in |/dev/null
 real  0m0.028s
 user  0m0.011s
 sys   0m0.007s
 
 psxx:/tmp$ ghc --make -fforce-recomp -o out buga.hs -O
 [1 of 1] Compiling Main ( buga.hs, buga.o )
 Linking out ...
 psxx:/tmp$ time ./out  3-med.in |/dev/null
 real  0m0.252s
 user  0m0.225s
 sys   0m0.011s
 
 psxx:/tmp$ ghc --make -fforce-recomp -o out buga.hs -O2
 [1 of 1] Compiling Main ( buga.hs, buga.o )
 Linking out ...
 Vazeny pane, cekam na Vase rozkazy.
 psxx:/tmp$ time ./out  3-med.in |/dev/null
 real  0m0.239s
 user  0m0.225s
 sys   0m0.010s
 
 psxx:/tmp$ ghc --version
 The Glorious Glasgow Haskell Compilation System, version 6.10.1
 
 
 The GHC documentation states that
 
  -O2:
  Means: Apply every non-dangerous optimisation, even if it means
  significantly longer compile times.  The avoided dangerous
  optimisations are those that can make runtime or space worse if
  you're unlucky. They are normally turned on or off individually.
 
 If I understand this correctly, the dangerous optimisations should not
 be performed with -O.  Am I doing anything wrong?  Am I hitting a bug
 in GHC optimiser? A known one?
 
 
  The program source:
 
 --
 p...@r4at184:/tmp$ cat buga.hs 
 {-# LANGUAGE FlexibleContexts #-}
 
 import Control.Monad
 import Control.Monad.State
 
 data Predpoc a = Nic | Kus { delka :: Int,
  levy :: Predpoc a,
  pravy :: Predpoc a }
   deriving Show
 
 gList i = Kus 1 Nic Nic
 
 gPredpoc kus1 kus2 =
   Kus (delka kus1 + delka kus2)
   kus1 kus2
 
 
 pop :: MonadState [a] m = m a
 pop = get = \(x:xs) - put xs  return x
 
 mbuild :: MonadState [Int] m = Int - m (Predpoc Int)
 mbuild 1 = gList `liftM` pop
 mbuild n = liftM2 gPredpoc (mbuild n1) (mbuild n2)
   where n1 = n`div`2
 n2 = n - n1
 
 build n li = evalState (mbuild n) li
 
 best :: Predpoc Int - Int - Int - Int
 best kus i j
   | i == 1  j == delka kus
 = delka kus
   | j = del1   = best (levy kus) i j
   | i  del1= best (pravy kus) (i-del1) (j-del1)
   | otherwise   = best (levy kus) i del1 +
   best (pravy kus) 1 (j-del1)
   where
 del1 = delka (levy kus)
 
 main = do
   n - read `liftM` getLine
   pole - liftM (build n . map read . words) getLine
   replicateM_ 100 $ do
 getLine
 print $ best pole 42 420
 --
 
  The sample input file (30k) can be downloaded from
 http://pikomat.mff.cuni.cz/petr/3-med.in
 
  I suspect that the main's variable pole (which is a large
 binary tree of type Predpoc Int) may be built from scratch in each
 iteration of the replicateM_ loop.
 
  Petr
 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Ghc: -O harmful?

2009-04-06 Thread Daniel Fischer
Am Montag 06 April 2009 20:37:46 schrieb Don Stewart:
 -fno-state-hack?

That, or

{-# LANGUAGE BangPatterns #-}

main = do
  n - read `liftM` getLine
  !pole - liftM (build n . map read . words) getLine
  replicateM_ 100 $ do
    getLine
    print $ best pole 42 420

if the state-hack is beneficial in other places of the programme.
The bang on pole tells GHC to calculate it only once, not inline it.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe