私が理解しているのは、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.5ght とは言えない私のラップトップでは、これには 1 秒もかかりません。
n を 1000000 に設定すると、OS が狂ったようにページングするため、この投稿の残りの部分を書くのが難しくなります。間違いなく1ギガ以上のRAMを使用しています(終了させませんでした)。十分な RAM があれば、100000 バージョンの適切な 10 倍の時間で確実に動作します。
ここによると、デフォルトのスタック サイズは 1k です。したがって、理論的には 1,000,000 のスレッドを作成できると思います。スタックは約 1Gb のメモリを占有します。
ここのベンチマークを使用して、http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi
スレッド スタック サイズをベンチマークに適合するサイズに縮小することで、ベンチマークごとにパフォーマンスを向上させることができます。たとえば、スレッドあたり 512 バイトのスタックを持つ 1M スレッドの場合、2.7 秒かかります。
$ time ./A +RTS -s -k0.5k