并行和并发编程(Haskell)的开销是多少?

时间:2017-07-12 06:52:11

标签: multithreading haskell concurrency parallel-processing

并行和并发编程(Haskell)的开销是多少?

  

然而,即使在纯函数式语言中,自动并行化也会受到一个古老问题的阻碍:为了使程序更快,我们必须从并行性中获得更多,因为开销添加它,编译时分析无法在这方面做出很好的判断。另一种方法是使用运行时分析来找到并行化的良好候选者,并将此信息反馈给编译器。然而,即便如此,在实践中并不是非常成功。

(引自Simon Marlow的书 Haskell中的并行和并发编程

Haskell中有哪些例子?

2 个答案:

答案 0 :(得分:3)

在任何系统中,线程都需要资源。你必须在某个地方存储该线程的状态。创建线程并将其设置为运行需要一些时间。现在GHC使用轻量级"绿色线程",它比OS线程便宜得多。但他们仍然花费一些东西

如果你(例如)为每一个添加,减去,乘法和除法产生一个新线程......好吧,产生一个新线程的工作必须是至少几十个机器指令,而一个小事。算术运算可能只是一条指令。将工作排队作为火花比生成一个全新的线程所需的工作量更少,但即使这样做也不像在当前线程上进行操作那么便宜。

基本上,您想要并行完成的工作成本必须超过安排并行完成的成本。 (无论是发布操作系统线程还是绿色线程或排队火花等等。)GHC有各种各样的东西可以降低成本,但它仍然没有免费

答案 1 :(得分:0)

您必须了解线程资源。他们不是免费的。换句话说:当您创建一个线程(独立于语言)时,您必须进行系统调用,操作系统必须创建一个线程实例,依此类推。线程有状态 - 随时间变化;所以某种线程管理在后台发生。

当然,当你最终得到更多线程而不是底层硬件可以支持时 - 那么系统将不得不不时地切换线程。当然,这并不像切换完整的流程那样昂贵,但它仍然意味着需要保存(或恢复)寄存器,您的硬件缓存可能会受到影响,等等。