Berapa lama untuk membuat 1 juta thread di Haskell?

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?


person FlinkmanSV    schedule 14.12.2009    source sumber
comment
Itu sepenuhnya tergantung pada perangkat keras Anda. Mengapa Anda tidak mencobanya sendiri dan beri tahu kami hasilnya?   -  person Michael Borgwardt    schedule 14.12.2009
comment
Masalah saya adalah saya tidak mengenal Haskell. Saya mengharapkan kode Haskell. Bukankah semua orang menggunakan laptop 2,5Ghz saat ini?   -  person FlinkmanSV    schedule 14.12.2009


Jawaban (4)


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.

person barkmadley    schedule 14.12.2009
comment
Terima kasih! membuat 1000.000 thread di Linux 64bit itu cepat! nyata 0m4.176s pengguna 0m2.833s sistem 0m1.284s - person FlinkmanSV; 14.12.2009

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.

person Justin    schedule 14.12.2009
comment
oke, 1K kedengarannya besar. Ukuran tumpukan di protothreads adalah 128 Bytes. - person FlinkmanSV; 14.12.2009
comment
Benar-benar? Saya pikir 1k cukup kecil - ukuran tumpukan default di C++ adalah 1MB. - person Justin; 14.12.2009
comment
Anda selalu dapat mengubah ukuran tumpukan default, jika Anda mau. - person Jake McArthur; 01.03.2014

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
person Don Stewart    schedule 16.12.2009

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
person marni    schedule 28.02.2014