Сколько времени занимает создать 1 миллион потоков в Haskell?

Что я понимаю, Haskell имеют зеленые потоки. Но как легкий вес - они. Действительно ли возможно создать 1 миллион потоков?

Или Сколько времени это взяло бы для 100 000 потоков?

14
задан Don Stewart 18 April 2011 в 18:27
поделиться

3 ответа

Согласно здесь размер стека по умолчанию составляет 1 КБ, поэтому я предполагаю, что теоретически можно было бы создать 1000000 потоков - стек займет около 1 ГБ памяти .

4
ответ дан 1 December 2019 в 12:26
поделиться

из здесь .

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,5-гигабайтном ноутбуке это занимает меньше секунды.

установите n на 1000000, и становится трудно записать остальная часть этого поста, потому что ОС работает как сумасшедшая. определенно используя больше, чем гиг барана (не позволил ему закончить). Если у вас достаточно ОЗУ, она определенно будет работать в 10 раз быстрее, чем версия 100000.

17
ответ дан 1 December 2019 в 12:26
поделиться

Используя тест здесь, http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi

Вы можете улучшить производительность на per бенчмарк-базис, уменьшив размер стека потоков до того, который соответствует эталонному тесту. Например, поток 1M со стеком 512 байт на поток занимает 2,7 секунды

$ time ./A +RTS -s -k0.5k
2
ответ дан 1 December 2019 в 12:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: