2009-12-14 29 views
14

Những gì tôi hiểu, Haskell có chủ đề màu xanh lá cây. Nhưng làm thế nào trọng lượng nhẹ là họ. Có thể tạo 1 triệu chủ đề không?Mất bao lâu để tạo 1 triệu chủ đề trong Haskell?

Hoặc mất bao lâu cho 100 000 chủ đề?

+6

Điều đó phụ thuộc hoàn toàn vào phần cứng của bạn. Tại sao bạn không thử nó trên máy của bạn và cho chúng tôi biết kết quả? –

+0

Vấn đề của tôi là tôi không biết Haskell. Tôi đã hy vọng mã Haskell. Không phải tất cả mọi người trên một máy tính xách tay 2.5Ghz những ngày này? – Flinkman

Trả lời

4

Vâng theo here kích thước ngăn xếp mặc định là 1k, vì vậy tôi giả sử về lý thuyết có thể tạo 1.000.000 chủ đề - ngăn xếp sẽ chiếm khoảng 1Gb bộ nhớ.

+0

ok, 1K âm thanh to. Kích thước ngăn xếp trong protothreads là 128 byte. – Flinkman

+4

Thật sao? Tôi nghĩ 1k khá nhỏ - kích thước ngăn xếp mặc định trong C++ là 1MB. – Justin

+0

Bạn luôn có thể thay đổi kích thước ngăn xếp mặc định, nếu bạn muốn. –

17

từ 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 

trên máy tính xách tay không khá 2.5gh này mất ít hơn một giây.

đặt n thành 1000000 và trở nên khó viết phần còn lại của bài đăng này vì hệ điều hành đang phân trang như điên. chắc chắn sử dụng nhiều hơn một gig của ram (đã không để cho nó kết thúc). Nếu bạn có đủ RAM nó chắc chắn sẽ làm việc trong 10x thích hợp thời gian của phiên bản 100000.

+0

Cảm ơn! làm 1000000 chủ đề trên 64bit Linux là nhanh chóng! thực 0m4.176s người dùng 0m2.833s sys 0m1.284s – Flinkman

0

Đối với trường hợp kiểm tra tổng hợp này, các luồng phần cứng sinh ra dẫn đến chi phí đáng kể. Làm việc chỉ với các chủ đề màu xanh lá cây trông giống như một lựa chọn ưa thích. Lưu ý rằng việc tạo ra các luồng màu xanh lá cây trong Haskell thực sự là giá rẻ. Tôi đã chạy lại chương trình trên, với n = 1m trên MacBook Pro, i7, 8GB RAM, sử dụng:

$ ghc --version 
The Glorious Glasgow Haskell Compilation System, version 7.6.3 

Biên soạn với -rtsopts -threaded và:

$ time ./thr 
1000000 

real 0m5.974s 
user 0m3.748s 
sys 0m2.406s 

Giảm chồng giúp một chút:

$ time ./thr +RTS -k0.5k 
1000000 

real 0m4.804s 
user 0m3.090s 
sys 0m1.923s 

Sau đó, biên soạn mà không -threaded:

$ time ./thr 
1000000 

real 0m2.861s 
user 0m2.283s 
sys 0m0.572s 

Và cuối cùng, nếu không có -readed và với ngăn xếp giảm:

$ time ./thr +RTS -k0.5k 
1000000 

real 0m2.606s 
user 0m2.198s 
sys 0m0.404s 
Các vấn đề liên quan