【问题标题】:Benefit from concurrent programming (-languages)? [closed]受益于并发编程(-languages)? [关闭]
【发布时间】:2011-11-14 17:23:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: performance concurrency clojure erlang


【解决方案1】:

随着大多数好的答案开始,这取决于您要做什么,在这种情况下,这取决于您要在什么上做(硬件)。

目前,有一些不错的机器可以使用 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,我在这里问了一个相关问题:How many CPUs are needed before Erlang is faster than single-threaded Java 的答案在这些方面有更多的细节和论据......

【讨论】:

    【解决方案2】:

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

    clojure 背后的理念是构造(不变性、事务)使您能够更轻松地推理并发。

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-12
      • 2015-01-06
      相关资源
      最近更新 更多