14

私が理解しているのは、Haskell にはグリーン スレッドがあるということです。しかし、どれだけ軽いか。100万のスレッドを作成することは可能ですか?

または、100,000 スレッドの場合、どのくらいの時間がかかりますか?

4

4 に答える 4

17

ここから。

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 倍の時間で確実に動作します。

于 2009-12-14T13:29:39.297 に答える
4

ここによると、デフォルトのスタック サイズは 1k です。したがって、理論的には 1,000,000 のスレッドを作成できると思います。スタックは約 1Gb のメモリを占有します。

于 2009-12-14T10:58:53.453 に答える
2

ここのベンチマークを使用して、http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi

スレッド スタック サイズをベンチマークに適合するサイズに縮小することで、ベンチマークごとにパフォーマンスを向上させることができます。たとえば、スレッドあたり 512 バイトのスタックを持つ 1M スレッドの場合、2.7 秒かかります。

$ time ./A +RTS -s -k0.5k
于 2009-12-16T00:32:55.933 に答える