【问题标题】:What makes Erlang unsuitable for computationally expensive work?是什么让 Erlang 不适合计算量大的工作?
【发布时间】:2012-06-28 04:25:21
【问题描述】:

在Erlang编程的开头,有以下几点:

是什么让 Erlang 成为您项目的最佳选择?这取决于你在看什么 建造。如果您正在考虑编写一个数字运算应用程序,一个图形 - 密集型系统,或在手机上运行的客户端软件,那么对不起,你 买错书了。

隐含的信息是 Erlang 不适合计算量大的工作。是什么让 Erlang 如此不适合,还是我误解了?

【问题讨论】:

  • 部分是其他语言比较适合; Erlang 的强大套件不是数字算法。为此,您将使用 C/Fortran/etc。
  • 它是因为在计算方面其他东西比 Erlang 更好。 Erlang 仍然进行计算,如果计算问题可以是parallerised,那么 erlang 甚至可能会表现得更好。

标签: erlang


【解决方案1】:

Erlang 适用于 I/O 密集型应用程序,即限制因素是 I/O 操作的延迟和吞吐量而不是指令通过 CPU 管道的速率的问题。 Web 服务器和数据库是 I/O 密集型应用程序的好例子:限制因素可能是磁盘和网络,而不是 CPU。传统上“计算量大”的应用程序包括加密工具和科学模拟。

为什么 Erlang 在计算密集型问题上无法匹配 C 和 Fortran 等语言,我们必须考虑代码生成和缓存友好性等问题......我会尝试一下:

  • 代码生成:通常当你启动一个 Erlang 程序时,它会在 BEAM 中运行,一个基于 threaded codevirtual machine。尽管 BEAM 对于大多数用途而言都表现得足够好,但与现代优化 C 编译器生成的那种代码相比,它的每个逻辑“指令”的开销要大得多。 HiPE 项目为 Erlang 提供了本机代码编译器,该编译器在几年前已集成到主 OTP 源代码树中*。虽然它确实提高了 Erlang 的数字运算能力,但它仍然很难与编写良好的 C 或 Fortran 程序相匹敌。
  • 缓存友好性:内存系统是现代计算机的主要瓶颈:从主内存读取可能需要数百个处理器周期!为了解决这个问题,CPU 设计人员引入了多级缓存来隐藏内存延迟。缓存利用计算机程序的两个关键属性:时间空间局部性——也就是说,最近被引用的内存区域(和附近的区域)很可能再次被引用.像 C 和 Fortran 这样的语言对内存分配的位置和方式提供了很大的控制,使程序员能够调整算法以很好地使用缓存。对于像 Erlang 这样的动态语言,通常情况并非如此,其中内存分配对程序员隐藏,由虚拟机自动处理。
  • 代码大小:关于空间局部性的论点也适用于代码; Erlang 代码,无论是原生还是字节码形式,通常都会比相应的编译 C 代码大。这会导致指令缓存中更频繁的未命中。

请记住,这只是冰山一角,我绝不是 Erlang 或语言实现方面的专家。不过,不要让 Erlang 可能永远不会运行科学模拟的事实吓到你;对于许多应用程序来说,它是一种绝对出色的语言。

*HiPE 可通过 Debian 中的 erlang-base-hipe 包获得,或来自源代码压缩包的 ./configure --enable-hipe

【讨论】:

  • 好帖子!简而言之,性能最大化,“您越接近正在编程的机器,您可以获得的速度就越快,因为可以减少每条逻辑指令的开销。”
  • 感谢您的客气话和精彩的总结!
【解决方案2】:

只是 C 代码在大多数情况下可能会相当快。 Erlang 擅长容错、分布式计算和并发。程序员往往同样精通编写 erlang 或其他语言,但如果您想要速度,请使用 C 或 C++,可能来自 erlang 端口,因此您可以在您自己的 erlang 应用程序中使用此代码。

【讨论】:

    【解决方案3】:

    Erlang 是一种并发函数式编程语言,专为大型工业实时系统编程而设计。没有什么特别能阻止您开发“数字运算应用程序或图形密集型系统”,但该语言在实时事件处理方面大放异彩。

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多