views:

249

answers:

3

What I understand, Haskell have green threads. But how light weight are they. Is it possible to create 1 million threads?

Or How long would it take for 100 000 threads?

+4  A: 

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.

Kragen
ok, 1K sounds big. The stack size in protothreads is 128 Bytes.
Flinkman
Really? I thought 1k was pretty small - the default stack size in C++ is 1MB.
Kragen
+8  A: 

from 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

on my not quite 2.5gh laptop this takes less than a second.

set n to 1000000 and it becomes hard to write the rest of this post because the OS is paging like crazy. definitely using more than a gig of ram (didn't let it finish). If you have enough RAM it would definitely work in the appropriate 10x the time of the 100000 version.

barkmadley
Thanks! making 1000000 threads on 64bit Linux is fast!real 0m4.176suser 0m2.833ssys 0m1.284s
Flinkman
+1  A: 

Using the benchmark here, http://www.reddit.com/r/programming/comments/a4n7s/stackless%5Fpython%5Foutperforms%5Fgoogles%5Fgo/c0ftumi

You can improve the performance on a per benchmark-basis by shrinking the thread stack size to one that fits the benchmark. E.g. 1M threads, with a 512 byte stack per thread, takes 2.7s

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