【发布时间】:2020-09-10 06:06:37
【问题描述】:
我正在使用以下代码对forkIO 进行基准测试:
import System.Time.Extra
import Control.Concurrent
import Control.Monad
import Data.IORef
n = 200000
main :: IO ()
main = do
bar <- newEmptyMVar
count <- newIORef (0 :: Int)
(d, _) <- duration $ do
replicateM_ n $ do
forkIO $ do
v <- atomicModifyIORef' count $ \old -> (old + 1, old + 1)
when (v == n) $ putMVar bar ()
takeMVar bar
putStrLn $ showDuration d
这会产生 20K 线程,计算有多少线程使用 IORef 运行,当它们全部启动时,完成。在 Windows 上使用命令 ghc --make -O2 Main -threaded && main +RTS -N4 在 GHC 8.10.1 上运行时,性能差异很大。有时需要 > 1 秒(例如 1.19 秒),有时需要
当我将n 缩放到 1M 时,效果消失了,并且始终在 5+s 范围内。
【问题讨论】:
标签: performance haskell concurrency