Что я понимаю, у Haskell есть зеленые потоки. Но насколько они легки. Можно ли создать 1 миллион потоков?
Или Сколько времени потребуется для 100 000 потоков?
Что я понимаю, у Haskell есть зеленые потоки. Но насколько они легки. Можно ли создать 1 миллион потоков?
Или Сколько времени потребуется для 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,5-дюймовом ноутбуке это занимает меньше секунды.
установите значение n на 1000000, и будет сложно записать остальную часть этого сообщения, потому что ОС работает под псевдонимом, как сумасшедший. определенно используя больше, чем концерт ram (не позволял ему закончить). Если у вас достаточно оперативной памяти, то определенно будет работать в 10 раз больше времени версии 100000.
В соответствии с здесь размер стека по умолчанию равен 1k, поэтому, теоретически, можно было бы создать 1,000,000 потоков - стек будет занимать около 1 ГБ памяти.
Используя здесь тест, 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 действительно дешевая. Я перезапустил вышеуказанную программу с n = 1 м на MacBook Pro, i7, 8 ГБ ОЗУ, используя:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
Скомпилирован с -threaded и -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
Затем, скомпилированный без -threaded:
$ time ./thr
1000000
 real   0m2.861s
 user   0m2.283s
 sys    0m0.572s
И, наконец, без -тобы и с уменьшенным стеком:
$ time ./thr +RTS -k0.5k
1000000
 real   0m2.606s
 user   0m2.198s
 sys    0m0.404s