在Haskell中创建100万个线程需要多长时间?

时间:2009-12-14 10:42:37

标签: multithreading haskell concurrency green-threads

据我所知,Haskell有绿线。但他们的重量有多轻。是否有可能创建100万个线程?

或者10万个线程需要多长时间?

4 个答案:

答案 0 :(得分:17)

来自here

import Control.Concurrent
import Control.Monad

n = 100000

main = do
    left  <- newEmptyMVar
    right <- foldM make left [0..n-1]
    putMVar right 0    -- bang!
    x <- takeMVar left -- wait for completion
    print x
 where
    make l n = do
       r <- newEmptyMVar
       forkIO (thread n l r)
       return r

thread :: Int -> MVar Int -> MVar Int -> IO ()
thread _ l r = do
   v <- takeMVar r
   putMVar l $! v+1

在我不太高的2.5gh笔记本电脑上,这需要不到一秒钟。

将n设置为1000000并且很难写出这篇文章的其余部分,因为操作系统像疯了一样分页。绝对使用超过一个公羊(没有让它完成)。如果你有足够的RAM,它肯定会在100000版本的适当时间内工作10倍。

答案 1 :(得分:4)

根据here,默认堆栈大小是1k,所以我认为理论上可以创建1,000,000个线程 - 堆栈将占用大约1Gb的内存。

答案 2 :(得分:2)

在此使用基准http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi

您可以通过将线程堆栈大小缩小到适合基准的大小来提高每个基准测试的性能。例如。每个线程具有512字节堆栈的1M线程需要2.7s

$ time ./A +RTS -s -k0.5k

答案 3 :(得分:0)

对于此综合测试用例,产生硬件线程会导致大量开销。仅使用绿色线程看起来是首选选项。请注意,在Haskell中生成绿色线程确实很便宜。我重新运行上面的程序,在MacBook Pro,i7,8GB内存上使用n = 1m,使用:

$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3

使用-threaded和-rtsopts编译:

$ time ./thr
1000000

 real   0m5.974s
 user   0m3.748s
 sys    0m2.406s

减少堆栈有点帮助:

$ time ./thr +RTS -k0.5k
1000000

 real   0m4.804s
 user   0m3.090s
 sys    0m1.923s

然后,编译时没有-threaded:

$ time ./thr
1000000

 real   0m2.861s
 user   0m2.283s
 sys    0m0.572s

最后,没有线程和减少堆栈:

$ time ./thr +RTS -k0.5k
1000000

 real   0m2.606s
 user   0m2.198s
 sys    0m0.404s