2009-12-14 8 views
14

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?

+6

To zależy wyłącznie od twojego sprzętu. Dlaczego nie spróbujesz tego na swoich i powiesz nam o wynikach? –

+0

Moim problemem jest to, że nie znam Haskella. Miałem nadzieję na kod Haskella. Czy obecnie nie wszyscy na laptopie 2,5 GHz? – Flinkman

Odpowiedz

4

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.

+0

ok, 1K brzmi wielce. Rozmiar stosu w prototypach wynosi 128 bajtów. – Flinkman

+4

Naprawdę? Myślałem, że 1k jest całkiem mały - domyślny rozmiar stosu w C++ to 1MB. – Justin

+0

Zawsze możesz zmienić domyślny rozmiar stosu, jeśli chcesz. –

17

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.

+0

Dzięki! tworzenie 1000000 wątków na 64-bitowym Linuksie jest szybkie! prawdziwe 0m4.176s użytkownik 0m2.833s sys 0m1.284s – Flinkman

0

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 
Powiązane problemy