Yang saya pahami, Haskell memiliki benang hijau. Tapi betapa ringannya bobotnya. Bisakah membuat 1 juta thread?
Atau Berapa lama waktu yang dibutuhkan untuk 100.000 thread?
Yang saya pahami, Haskell memiliki benang hijau. Tapi betapa ringannya bobotnya. Bisakah membuat 1 juta thread?
Atau Berapa lama waktu yang dibutuhkan untuk 100.000 thread?
dari di sini.
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
pada laptop saya yang tidak terlalu 2,5gh, ini membutuhkan waktu kurang dari satu detik.
setel n ke 1000000 dan menjadi sulit untuk menulis sisa posting ini karena OS melakukan paging dengan gila-gilaan. pasti menggunakan lebih dari satu gig ram (tidak membiarkannya selesai). Jika Anda memiliki cukup RAM, itu pasti akan bekerja 10x lebih cepat daripada versi 100.000.
Menurut di sini ukuran tumpukan default adalah 1k, jadi saya kira secara teori dimungkinkan untuk membuat 1.000.000 utas - tumpukannya akan memakan sekitar 1Gb memori.
Menggunakan tolok ukur di sini, http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi
Anda dapat meningkatkan kinerja berdasarkan tolok ukur dengan memperkecil ukuran tumpukan thread ke ukuran yang sesuai dengan tolok ukur. Misalnya. Thread 1 juta, dengan tumpukan 512 byte per thread, membutuhkan waktu 2,7 detik
$ time ./A +RTS -s -k0.5k
Untuk kasus uji sintetik ini, pemijahan thread perangkat keras menghasilkan overhead yang signifikan. Bekerja hanya dengan benang hijau sepertinya merupakan pilihan yang lebih disukai. Perhatikan bahwa pemijahan benang hijau di Haskell memang murah. Saya telah menjalankan kembali program di atas, dengan n = 1m di MacBook Pro, i7, RAM 8GB, menggunakan:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
Dikompilasi dengan -threaded dan -rtsopts:
$ time ./thr
1000000
real 0m5.974s
user 0m3.748s
sys 0m2.406s
Mengurangi tumpukan sedikit membantu:
$ time ./thr +RTS -k0.5k
1000000
real 0m4.804s
user 0m3.090s
sys 0m1.923s
Kemudian, dikompilasi tanpa -threaded:
$ time ./thr
1000000
real 0m2.861s
user 0m2.283s
sys 0m0.572s
Dan terakhir, tanpa -thread dan dengan tumpukan yang dikurangi:
$ time ./thr +RTS -k0.5k
1000000
real 0m2.606s
user 0m2.198s
sys 0m0.404s