据我了解,Haskell 有绿色线程。但是它们的重量是多么的轻。是否可以创建 100 万个线程?
或者 100 000 个线程需要多长时间?
据我了解,Haskell 有绿色线程。但是它们的重量是多么的轻。是否可以创建 100 万个线程?
或者 100 000 个线程需要多长时间?
从这里。
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 倍内工作。
Well according to here the default stack size is 1k, so I suppose in theory it would be possible to create 1,000,000 threads - the stack would take up around 1Gb of memory.
使用这里的基准,http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi
您可以通过将线程堆栈大小缩小到适合基准的大小来提高每个基准的性能。例如 1M 线程,每个线程有 512 字节的堆栈,需要 2.7 秒
$ time ./A +RTS -s -k0.5k
对于这个综合测试用例,生成硬件线程会导致大量开销。仅使用绿色线程似乎是首选。请注意,在 Haskell 中生成绿色线程确实很便宜。我重新运行了上面的程序,在 MacBook Pro、i7、8GB 内存上 n = 1m,使用:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
使用 -thread 和 -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
然后,在没有 -thread 的情况下编译:
$ time ./thr
1000000
real 0m2.861s
user 0m2.283s
sys 0m0.572s
最后,没有 -thread 和减少堆栈:
$ time ./thr +RTS -k0.5k
1000000
real 0m2.606s
user 0m2.198s
sys 0m0.404s