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

6
最近我正在尝试深入了解并发编程领域。一开始,我认为多核处理器的唯一原因是提高程序性能。但现在我不再确定了...
考虑到大多数语言编写多线程程序都很困难,许多人倾向于推荐专门设计的语言,如Erlang或Clojure作为并发计算的首选语言。当然,Erlang使编写并发程序更容易,但这值得吗?
我查阅了 shootout 上一些 Erlang 程序(是的,我知道微基准测试并不能说明太多...),惊讶地发现许多单核 C 程序甚至比四核 Erlang 程序表现更好。
那么我的问题是,像 Erlang、Clojure 等语言的优势是什么?当 C / Java 的单核程序速度更快时,为什么我要使用这种易于编写多核程序的语言?
(我忘了提及,这些问题只涉及多核机器,分布式计算是另一回事,我可以看出 Erlang 在这里的优势)

两个值得观看的视频链接:http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey 和 http://www.infoq.com/presentations/An-Introduction-to-Clojure-Time-Model。我原本打算将它们作为更长回答的一部分发布,但当我正在撰写时,有人关闭了问题(感谢你们……)。 - mikera
2
并发通常只在更大更复杂的项目中成为问题。线程锁定的问题很容易导致程序减速或根本无法正确工作。此外,多线程并不适用于所有领域的速度增加。这可能解释了C语言在微基准测试中的优势。 - NielsK
2
@Moe - Erlang FAQ提供了非常合理的答案 - 请参阅“1.3 Erlang特别适用于哪些应用程序?”- http://www.erlang.org/faq/introduction.html#id50265 - 和“1.4 Erlang不特别适用于哪些问题?”http://www.erlang.org/faq/introduction.html#id49866 - igouy
谢谢回答,我觉得这一定与多核心有关,并且编写代码的复杂性也是原因之一。 - Moe
当Erlang在实际应用中胜过C++:http://www.slideshare.net/Arbow/comparing-cpp-and-erlang-for-motorola-telecoms-software 你说得对,微基准测试也有其缺陷;-) - Hynek -Pichi- Vychodil
2个回答

6
正如大部分好的答案一样,它取决于你要做什么,特别是硬件方面。目前有一些不错的机器可用,配备了32个或更多的 CPU。要利用所有这些CPU,需要以下两种方式之一:
1. 用所选语言编写多线程程序; 2. 编写单线程程序并运行许多实例,这些实例以某种方式进行通信(以划分工作负载)来解决您的问题。
通常情况下,第一种方式比第二种方式容易得多。
如果您看一下“硬件的未来”,似乎趋势是向更多的 CPU 而不是更快的 CPU 发展。因此,假设 ParaCCC(虚构语言)比 C 慢10倍,但是您有一台可以利用 ParaCCC (对于我们的问题)的512个 CPU 的机器。理论上,ParaCCC 程序将比 C 程序快51倍,而无需重写。此外,C 通常不以其上市时间闻名,而这些新语言又能炫耀另一个特点。
此外,您可能没有考虑到,大多数进行任何量的 I/O 的程序最终都会成为多线程的,因为您倾向于为 I/O 和处理使用不同的线程,而且您不希望一个缓慢的客户端拖慢您的速度(显然,C 可以做到这一点,但线程模型通常更美观)。
关于 Erlang,我在这里问了一个相关的问题:多少个 CPU 之后 Erlang 比单线程 Java 更快,其中的答案具有更多的细节和类似的论证。

3
Clojure是一个非常好的选择,特别是在权衡方面。它不像Erlang那样对你施加很多限制,事实上,如果你喜欢,你可以总是以一种可变的命令式风格(虽然更丑陋)重写需要更高性能的部分,从而获得Java的速度。然而,正确性和并发保证为您解决了任何足够复杂的问题提供了比C和Java更快的上市时间,我们都知道开发人员的时间比硬件成本更有价值。
Clojure的理念是构造(不可变性、事务)使您更容易地理解并发。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接