Co rozumiem, Haskell ma zielone nitki. Ale jak lekkie są one. Czy można utworzyć milion wątków?Ile czasu zajmuje utworzenie miliona nici w Haskell?
Albo jak długo potrwa 100 000 wątków?
Co rozumiem, Haskell ma zielone nitki. Ale jak lekkie są one. Czy można utworzyć milion wątków?Ile czasu zajmuje utworzenie miliona nici w Haskell?
Albo jak długo potrwa 100 000 wątków?
Zgodnie z domyślnym rozmiarem stosu jest 1k, więc teoretycznie byłoby możliwe utworzenie 1 000 000 wątków - stos zajmie około 1 GB pamięci.
z 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
na moim niezupełnie 2,5-godzinnym laptopie zajmuje to mniej niż sekundę.
Ustaw na 1000000 i ciężko będzie napisać resztę tego posta, ponieważ system operacyjny jest stronicowany jak szalony. zdecydowanie wykorzystując więcej niż gig pamięci (nie dopuścił do zakończenia). Jeśli masz wystarczającą ilość pamięci RAM, to na pewno zadziała w odpowiednim 10-krotnym czasie w wersji 100000.
Dzięki! tworzenie 1000000 wątków na 64-bitowym Linuksie jest szybkie! prawdziwe 0m4.176s użytkownik 0m2.833s sys 0m1.284s – Flinkman
Korzystanie benchmark tu http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi
Można poprawić wydajność w przeliczeniu na podstawie benchmarku-poprzez zmniejszanie rozmiaru stosu jeden wątek, który pasuje do benchmarku. Na przykład. 1M nici ze stosu 512 bajtów na nici odbywa 2.7s
$ time ./A +RTS -s -k0.5k
tego syntetycznego testu, nici metalowe tarło powoduje znaczne koszty ogólne. Praca z zielonymi wątkami wygląda jak preferowana opcja. Zauważ, że pojawianie się zielonych nici w Haskell jest rzeczywiście tanie. Mam ponownie uruchomić powyższy program, n = 1m na MacBook Pro i7, 8GB RAM, używając:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
Zestawione z -threaded i -rtsopts:
$ time ./thr
1000000
real 0m5.974s
user 0m3.748s
sys 0m2.406s
zmniejszenie stos pomaga trochę:
$ time ./thr +RTS -k0.5k
1000000
real 0m4.804s
user 0m3.090s
sys 0m1.923s
Następnie skompilowany bez -threaded:
$ time ./thr
1000000
real 0m2.861s
user 0m2.283s
sys 0m0.572s
I wreszcie, bez -threaded iz obniżonym stosu:
$ time ./thr +RTS -k0.5k
1000000
real 0m2.606s
user 0m2.198s
sys 0m0.404s
To zależy wyłącznie od twojego sprzętu. Dlaczego nie spróbujesz tego na swoich i powiesz nam o wynikach? –
Moim problemem jest to, że nie znam Haskella. Miałem nadzieję na kod Haskella. Czy obecnie nie wszyscy na laptopie 2,5 GHz? – Flinkman