@@ -26,41 +26,66 @@ toMicroSecs x = x * 10^(6 :: Int)
26measureRate' :: IsStream t
26measureRate' :: IsStream t
28 -> (t IO Int -> SerialT IO Int)
28 -> (t IO Int -> SerialT IO Int)
29− -> Double
29+ -> Int -- buffers
31+ -> Either Double Int -- either rate or count of actions
31 -> (Double, Double)
33 -> (Double, Double)
32 -> (Double, Double)
34 -> (Double, Double)
34−measureRate' desc t rval consumerDelay producerDelay dur =
36+measureRate' desc t buffers threads rval consumerDelay producerDelay expectedRange = do
35− it (desc <> " rate: " <> show rval
37+
40+ Left r -> S.take (round $ 10 * r) . S.repeatM
41+ Right n -> S.replicateM n
43+ rateDesc = case rval of
44+ Left r -> " rate: " <> show r
45+ Right n -> " count: " <> show n
48+ <> " buffers: " <> show buffers
49+ <> " threads: " <> show threads
36 <> ", consumer latency: " <> show consumerDelay
50 <> ", consumer latency: " <> show consumerDelay
37 <> ", producer latency: " <> show producerDelay)
51 <> ", producer latency: " <> show producerDelay)
38− $ durationShouldBe dur $
52+ $ durationShouldBe expectedRange $
39− runStream
53+ runStream
40− $ (if consumerDelay > 0
54+ $ (if consumerDelay > 0
41− then S.mapM $ \x ->
55+ then S.mapM $ \x ->
42− threadDelay (toMicroSecs consumerDelay) >> return x
56+ threadDelay (toMicroSecs consumerDelay) >> return x
45− $ maxBuffer (-1)
59+ $ maxBuffer buffers
46− $ maxThreads (-1)
60+ $ maxThreads threads
47− $ avgRate rval
61+ $ (case rval of {Left r -> avgRate r; Right _ -> rate Nothing})
48− $ S.take (round $ rval * 10)
62+ $ threadAction $ do
50− let (t1, t2) = producerDelay
63+ let (t1, t2) = producerDelay
51− r <- if t1 == t2
64+ r <- if t1 == t2
52− then return $ round $ toMicroSecs t1
65+ then return $ round $ toMicroSecs t1
53− else randomRIO ( round $ toMicroSecs t1
66+ else randomRIO ( round $ toMicroSecs t1
54− , round $ toMicroSecs t2)
67+ , round $ toMicroSecs t2)
55− when (r > 0) $ -- do
68+ when (r > 0) $ -- do
56− -- t1 <- getTime Monotonic
69+ -- t1 <- getTime Monotonic
57− threadDelay r
70+ threadDelay r
58− -- t2 <- getTime Monotonic
71+ -- t2 <- getTime Monotonic
59− -- let delta = fromIntegral (toNanoSecs (t2 - t1)) / 1000000000
72+ -- let delta = fromIntegral (toNanoSecs (t2 - t1)) / 1000000000
60− -- putStrLn $ "delay took: " <> show delta
73+ -- putStrLn $ "delay took: " <> show delta
61− -- when (delta > 2) $ do
74+ -- when (delta > 2) $ do
62− -- putStrLn $ "delay took high: " <> show delta
75+ -- putStrLn $ "delay took high: " <> show delta
78+measureRateVariable :: IsStream t
80+ -> (t IO Int -> SerialT IO Int)
86+measureRateVariable desc t rval consumerDelay producerDelay dur =
87+ measureRate' desc t (-1) (-1) (Left rval)
88+ consumerDelay producerDelay dur
65measureRate :: IsStream t
90measureRate :: IsStream t
@@ -72,10 +97,54 @@ measureRate :: IsStream t
73measureRate desc t rval consumerDelay producerDelay dur =
98measureRate desc t rval consumerDelay producerDelay dur =
74 let d = fromIntegral producerDelay
99 let d = fromIntegral producerDelay
75− in measureRate' desc t rval consumerDelay (d, d) dur
100+ in measureRateVariable desc t rval consumerDelay (d, d) dur
102+measureThreads :: IsStream t
104+ -> (t IO Int -> SerialT IO Int)
106+ -> Int -- count of actions
108+measureThreads desc t threads count = do
112+ else fromIntegral count / fromIntegral threads
113+ duration = (expectedTime * 0.9, expectedTime * 1.1)
114+ measureRate' desc t (-1) threads (Right count) 0 (1,1) duration
116+measureBuffers :: IsStream t
118+ -> (t IO Int -> SerialT IO Int)
120+ -> Int -- count of actions
122+measureBuffers desc t buffers count = do
126+ else fromIntegral count / fromIntegral buffers
127+ duration = (expectedTime * 0.9, expectedTime * 1.1)
128+ measureRate' desc t buffers (-1) (Right count) 0 (1,1) duration
77main :: IO ()
130main :: IO ()
78main = hspec $ do
131main = hspec $ do
133+ describe "maxBuffers" $ do
134+ measureBuffers "asyncly" asyncly (-1) 5
135+ -- XXX this test fails due to a known issue
136+ -- measureBuffers "maxBuffers" asyncly 1 5
137+ measureBuffers "asyncly" asyncly 5 5
139+ describe "maxThreads" $ do
140+ measureThreads "asyncly" asyncly (-1) 5
141+ measureThreads "asyncly" asyncly 1 5
142+ measureThreads "asyncly" asyncly 5 5
144+ measureThreads "aheadly" aheadly (-1) 5
145+ measureThreads "aheadly" aheadly 1 5
146+ measureThreads "aheadly" aheadly 5 5
79 let range = (8,12)
148 let range = (8,12)
81 -- Note that because after the last yield we don't wait, the last period
150 -- Note that because after the last yield we don't wait, the last period
@@ -108,7 +177,7 @@ main = hspec $ do
109 in describe "asyncly no consumer delay and variable producer delay" $
178 in describe "asyncly no consumer delay and variable producer delay" $
110 forM_ rates $ \r ->
179 forM_ rates $ \r ->
111− measureRate' "asyncly" asyncly r 0 (0.1, 3) range
180+ measureRateVariable "asyncly" asyncly r 0 (0.1, 3) range
113 let rates = [1, 10, 100, 1000, 10000
182 let rates = [1, 10, 100, 1000, 10000
114#ifndef __GHCJS__
183#ifndef __GHCJS__