受益于并发编程(多语言)



最近我试图深入并发编程的世界。一开始,我认为使用多核处理器的唯一原因是提高程序的性能。但现在我不确定了……

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

我在shootout上查了一些Erlang程序(是的,我知道微基准测试并没有说太多……),并且惊讶地发现许多单核C程序甚至比四核Erlang程序表现得更好。

所以我的问题是,像Erlang, Clojure等语言的优势是什么?当C/Java的单核程序更快时,我为什么要使用一种可以轻松编写多核程序的语言?

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

就像大多数好的答案一样,它取决于你想做什么,在这种情况下,它取决于你想在(硬件)上做什么。

目前,有一些不错的机器上有32个以上的cpu。要使用所有这些cpu,需要:

  1. 你可以用你选择的语言写一个多线程程序
  2. 你写一个单线程程序,并运行它的许多实例,所有这些实例都以某种方式通信(划分工作负载)来解决你的问题。

通常1比2容易做得多。

如果你看一下"硬件的未来",似乎有一个趋势是更多的cpu而不是更快的cpu。比如说,ParaCCC(假想语言)比C慢10倍,但是你有一台有512个cpu的机器可以使用ParaCCC(对于我们的问题)。理论上,ParaCCC程序的运行速度比C程序快51倍。不需要重写。Plus C通常不以其上市时间而闻名,而这是这些新语言的另一个优点。

同样,你可能没有考虑到大多数程序做任何数量的I/O最终都是多线程的,因为你倾向于使用不同的线程进行I/O而不是处理,你不希望一个缓慢的客户端减慢你的速度(显然C可以做到这一点,但线程模型通常看起来好多了)。

关于Erlang,我在这里问了一个相关的问题:在Erlang比单线程Java更快之前需要多少cpu ?关于这个问题的答案有更多的细节和参数…

Clojure正是这种权衡的好选择。它不像在erlang中那样对您施加那么多的约束,事实上,如果您愿意,您总是可以用可变的命令风格(仍然是clojure,尽管更难看)重写需要更多性能的部分,并获得java的速度。然而,对于任何足够复杂的问题,正确性和并发性保证使您比C和java更快地进入市场,我们都知道开发人员的时间比硬件成本更有价值。

clojure背后的思想是结构(不可变性,事务)使您能够更容易地推断并发性

最新更新