conc004.hs mis-optimised (performance weirdness)
The following program
(fptools/testsuite/tests/ghc-regress/concurrent/should_run/conc004.hs)
runs about 10 times as slowly when compiled with -O,
both with 6.2.1 and with todays CVS.
% ghc -no-recomp conc004.hs
% time ./a.out
donereal 1.97
user 1.88
sys 0.05
% ghc -no-recomp -O conc004.hs
% time ./a.out
donereal 21.69
user 20.40
sys 0.12
Strange enough, profiling completely reverses this:
% ghc -no-recomp -prof -auto-all conc004.hs
% time ./a.out +RTS -p
donereal 20.23
user 17.81
sys 0.18
total time = 2.10 secs (105 ticks @ 20 ms)
total alloc = 1,116,017,312 bytes (excludes profiling
overheads)
versus
% ghc -no-recomp -prof -auto-all -O conc004.hs
% time ./a.out +RTS -p
donereal 1.35
user 1.31
sys 0.01
total time = 0.94 secs (47 ticks @ 20 ms)
total alloc = 1,060,017,180 bytes (excludes profiling
overheads)
Which seems pretty weird. Except that multithreaded
programs are well known for weird (timing) problems ;o)
module Main where
-- Test thread creation.
-- (from: Einar Wolfgang Karlsen
<ewk@Informatik.Uni-Bremen.DE>)
import Control.Concurrent
main :: IO ()
main = do
mvar <- newEmptyMVar
let
spawner :: (IO () -> IO ThreadId) -> Int -> IO ()
spawner c 0 = putMVar mvar ()
spawner c n = do { c (spawner c (n-1)); return ()}
spawner forkIO 1000000
takeMVar mvar
putStr "done"
Trac metadata
Trac field |
Value |
Version |
6.2.1 |
Type |
Bug |
TypeOfFailure |
OtherFailure |
Priority |
normal |
Resolution |
ResolvedFixed |
Component |
Compiler |
Test case |
|
Differential revisions |
|
BlockedBy |
|
Related |
|
Blocking |
|
CC |
|
Operating system |
|
Architecture |
|