Erlang – C和Erlang

在erlang中有一些常见的库函数比它们的c等价物慢得多。

是否可以让c代码进行二进制解析和数字运算,并使用erlang生成进程来运行c代码?

当然,在优化之后,在极端情况下,C会更快。 如果速度越快意味着运行速度越快。

写作时,Erlang会更快,更快。 根据您对Erlang的速度要求可能“足够快”,它可以节省您在C中搜索错误的天数。

优化后,C代码只会更快。 如果你在C和Erlang上花费相同的时间,你会得到大约相同的速度(注意我在这个时间估计中花费了调试和错误修复的时间。这在Erlang中会少得多)。

所以:

faster writing = Erlang faster running (after optimisations) = C faster running without optimisations = any of the two 

随便挑选。

基于Erlang FAQ有两条粗略的经验法则:

  1. 主要涉及数字运算和数据处理的代码将比同等的C程序慢大约10倍。 这包括几乎所有“微观基准”。

  2. 大部分时间与其他系统通信,从故障中恢复并做出复杂决策的大型系统至少与同等C程序一样快。

但是有一些官方的解决方案来解决Erlang缺乏数字运算的问题:

  • 本机实现function (NIF):

在C中实现一个函数并将其目标代码加载到Erlang虚拟机中,就像标准的Erlang函数一样,但具有本机性能。

示例: Evedis , Bitcask , ElevelDB

  • 港口 :

通过标准输入和输出文件描述符从Erlang虚拟机到外部OS进程的面向字节的接口。 与此端口的通信是通过从Erlang的角度传递消息。

  • 港口司机 :

动态链接的C对象文件,加载到Erlang虚拟机中,就像一个端口。 与此端口驱动程序的通信是通过Erlang的角度传递消息。

示例: OTP_Inet , ENanomsg , P1_TLS

  • C节点 :

您可以简单地将Erlang运行时提升为分布式节点。 这种方式有一个规范,用于在C中实现Erlang运行时,并使用单个接口与Erlang节点通信。

所有上述解决方案都有其自身的优点和缺点,需要特别小心使用。

首先在Erlang中编写系统的整个逻辑,然后在C中实现处理二进制文件。使用NIF(它是C的接口)对系统的其余部分来说非常简单和透明。 这是另一个关于在Erlang中与C Run C Code Block交谈的话题 。

在攻击C之前,请确保您对当前实施进行基准测试。 它可能满足您的需求,特别是最新的Erlang / OTP版本(R14),它为二进制处理带来了很大的改进。

对于erlang而言,简单的线程并不那么有趣。 简单的线程+消息传递和OTP框架是令人敬畏的erlang。 如果你需要数字运算,请使用像ocaml,python,haskell这样的东西。 Erlang在数字运算方面非常擅长。

解析二进制文件是erlang最擅长的事情之一,可能是最好的。 Joe的书籍编程erlang非常好地涵盖了所有内容,并且使用起来并不那么昂贵。 它还讨论了集成C代码并举例说明。 源代码可以从实用的编程中获得,无需购买书籍,你可以grep #include或其他东西。

如果您真的在寻找速度,那么您应该尝试使用C和C ++的OpenMP或MPI并行编程框架。 我建议您查看并行编程模式(链接到amazon.com) ,了解OpenMP和MPI编程模式的详细信息。

Erlang ERTS参考手册中的erl_nif部分会很有帮助。

如果你喜欢Erlang,但想要C速度,为什么不去JOCAML。 它是OCAML的扩展(类似于Erlang,但在速度方面接近于C),专为目前正在进行的多核革命而设计。 我喜欢它(我知道超过10种编程语言……)

是,

但是,不止一种方式,松散地说,已经列出了部分或全部。

我们应该问:

  • 这些程序是否真的相同( ErlangC如何区别)?
  • 是否有更好的方法为此任务编写Erlang (其他过程/库或数据类型)?

考虑这篇文章可能会有所帮助: 使用Erlang进行缩放和加速 。

为了解决这个问题,是的,有可能让erlang调用一些c函数来处理特定的任务。 最常见的方法是使用NIF – http://erlang.org/doc/tutorial/nif.html 。 建议NIF仅用于Erlang版本20之前的短期运行function,几毫秒,因为它们是阻塞的,这对于Erlangs抢占式调度程序是无法使用的。 现在使用脏线程它更灵活,你可以阅读它。

需要注意的是,C可能在解析二进制文件方面更快,但是你应该运行测试,Erlang编写代码的速度要快得多。 Erlang通过模式匹配解析二进制文件非常出色。

我用C超过20年。 我几乎完全是在最近几年使用Erlang。 由于显而易见的原因,C运行得更快。 对于大多数事情来说,当你正确行事时,Erlang足够快。 另外,编写Erlang更快,更有趣。

对于运行时速度至关重要的算法,它肯定可以用C语言编写,这是Erlang BIF的方式。