【问题标题】:How long does it take to create 1 million threads in Haskell?在 Haskell 中创建 100 万个线程需要多长时间?
【发布时间】:2009-12-14 10:42:37
【问题描述】:

据我所知,Haskell 有绿色线程。但是它们的重量是多么的轻。是否可以创建 100 万个线程?

或者 100 000 个线程需要多长时间?

【问题讨论】:

  • 这完全取决于您的硬件。你为什么不在你的身上试一试,然后告诉我们结果呢?
  • 我的问题是我不知道 Haskell。我希望有 Haskell 代码。现在不是每个人都在使用 2.5Ghz 笔记本电脑吗?

标签: multithreading haskell concurrency green-threads


【解决方案1】:

来自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

在我不完全是 2.5gh 的笔记本电脑上,这需要不到一秒钟的时间。

将 n 设置为 1000000,因为操作系统正在疯狂地分页,所以很难写这篇文章的其余部分。肯定使用的内存不止一个(没有让它完成)。如果您有足够的 RAM,它肯定会在 100000 版本的适当时间的 10 倍内工作。

【讨论】:

  • 谢谢!在 64 位 Linux 上创建 1000000 个线程很快!真实 0m4.176s 用户 0m2.833s 系统 0m1.284s
【解决方案2】:

根据here,默认堆栈大小是 1k,所以我想理论上可以创建 1,000,000 个线程 - 堆栈将占用大约 1Gb 的内存。

【讨论】:

  • 好的,1K 听起来很大。 protothreads 中的堆栈大小为 128 字节。
  • 真的吗?我认为 1k 非常小 - C++ 中的默认堆栈大小是 1MB。
  • 如果需要,您可以随时更改默认堆栈大小。
【解决方案3】:

在这里使用基准,http://www.reddit.com/r/programming/comments/a4n7s/stackless_python_outperforms_googles_go/c0ftumi

您可以通过将线程堆栈大小缩小到适合基准的大小来提高每个基准的性能。例如。 1M线程,每个线程512字节堆栈,耗时2.7s

$ time ./A +RTS -s -k0.5k

【讨论】:

    【解决方案4】:

    对于这个综合测试用例,生成硬件线程会导致大量开销。仅使用绿色线程似乎是首选。请注意,在 Haskell 中生成绿色线程确实很便宜。我重新运行了上面的程序,在 MacBook Pro、i7、8GB 内存上 n = 1m,使用:

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

    使用 -thread 和 -rtsopts 编译:

    $ time ./thr
    1000000
    
     real   0m5.974s
     user   0m3.748s
     sys    0m2.406s
    

    减少堆栈有点帮助:

    $ time ./thr +RTS -k0.5k
    1000000
    
     real   0m4.804s
     user   0m3.090s
     sys    0m1.923s
    

    然后,在没有 -thread 的情况下编译:

    $ time ./thr
    1000000
    
     real   0m2.861s
     user   0m2.283s
     sys    0m0.572s
    

    最后,没有-线程和减少堆栈:

    $ time ./thr +RTS -k0.5k
    1000000
    
     real   0m2.606s
     user   0m2.198s
     sys    0m0.404s
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-18
      • 2023-03-11
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      相关资源
      最近更新 更多