【发布时间】:2012-04-02 08:52:41
【问题描述】:
在邮箱处理器循环中,我从阻塞集合中读取先前存储在此类集合中的项目。由于我使用相同的循环来写入此类集合,因此我需要将其作为线程启动。
async { process(queue.Take()) } |> Aysync.Start
我的整个代码的执行速度很慢(相对而言),我怀疑原因是我启动了新线程,尽管我用启动线程池
let toto = ThreadPool.SetMinThreads(300,300)
争点可能在这里的另一个提示是,如果我仅在队列为空时启动(并锁定整个部分)),我的运行时间差异很大,从 350 毫秒到 7 秒,而如果不这样做,它会停留大约 5-10 秒。
我的问题是:
- 有没有我可以在这里加速线程的创建
- 是否有一些结构已经处理了这种情况(消费者/生产者?),可以在邮箱处理器中使用?
【问题讨论】:
-
不要猜测你的性能问题在哪里,测量它!您可以使用分析器来执行此操作。
-
非常好的观点。我也坚信先测量后优化,我想我应该应用它。你能把它转移到答案吗? (因为我发现了 dotnet + fsharp 的东西,所以我对进行分析的好工具知之甚少……任何建议表示赞赏)
-
@nicolas - 为什么有这么多线程。我怀疑你会在大约 20 个线程时更快地发现事情(如果你受 CPU 限制,甚至更少)
-
就我而言,我是 IO 受限的。昨天之前我不知道 SetMinThreads(如果我排除了我在 5 年前知道的所有内容:))并且遇到了一个案例,它是缓慢的根源,所以谁知道..
-
我认为 svick 有一个优点:在优化之前,应该进行测量。这可能只是我调用的 IO 系统的一些缓慢的影响。我的计算运行时间从 400 毫秒到 20 秒。所以我的问题首先是不恰当的。
标签: multithreading f# async-await mailboxprocessor