从并发编程(语言)中受益?

时间:2011-09-11 11:13:53

标签: performance concurrency clojure erlang

最近我正试图深入了解并发编程的世界。在一开始我认为多核处理器的唯一原因是程序性能的提高。但现在我不再那么肯定......

考虑到在大多数语言中编写多线程程序是困难的事实,许多人倾向于推荐特别设计的语言,如Erlang或Clojure作为并发计算的首选语言。 当然,Erlang使编写并发程序变得容易得多,但值得吗?

我在枪战中查找了一些Erlang程序(是的,我知道microbenchmark并没有说太多......)并且很惊讶许多单核C程序甚至超越了四核Erlang程序。

所以我的问题是,Erlang,Clojure等语言有哪些优势? 当C / Java中的单核程序更快时,我为什么要使用一种语言来编写多核程序呢?

(我忘了提到,这些问题只与多核机器有关,分布式计算有所不同,我可以在这里看到Erlangs的优势)

2 个答案:

答案 0 :(得分:6)

当大多数好的答案开始时,它取决于你想要做什么,在这种情况下,它取决于你在(硬件)上尝试做什么。

目前,有一些不错的机器可以使用32 + cpus。要利用所有这些cpus,需要:

  1. 您使用您选择的语言编写多线程程序
  2. 您编写了一个单线程程序并运行了大量实例,这些实例都以某种方式进行通信(以分配工作负载)以解决您的问题。
  3. 通常1比2更容易做。

    如果你看一下“硬件的未来”,似乎有一种趋势是更多的cpus而不是更快的。所以说,ParaCCC(虚构语言)比C慢10倍,但你有一台512 cpus的机器,ParaCCC(对于我们的问题)可以使用。理论上,ParaCCC程序的运行速度比C程序快51倍。没有重写。 Plus C通常不知道它的上市时间,因为这是另一种吹嘘这些新语言。

    此外,您可能没有考虑到大多数执行任何数量I / O的程序最终都会出现多线程,因为您倾向于使用不同的线程进行I / O而非处理,而您不希望单个慢客户端让你失望(显然C可以做到这一点,但线程模型通常看起来更好)。

    关于Erlang,我在这里问了一个相关的问题:How many CPUs are needed before Erlang is faster than single-threaded Java其答案中有更多细节和参数......

答案 1 :(得分:3)

对于这种权衡,Clojure是一个很好的选择。它并没有像在erlang中那样对你施加任何限制,事实上,如果你喜欢并获得java的速度,你总是可以在可变的命令式样式中重写那些需要更多性能的部分(仍然在clojure中,虽然更丑陋)。但是,对于任何足够复杂的问题,正确性和并发性保证比C和Java更快上市,我们都知道开发人员的时间比硬件成本更高。

clojure背后的想法是构造(不变性,事务)使您能够更容易地推理并发。