Erlang - C and Erlang

7

在Erlang中,某些常见的库函数比它们的C语言等效函数慢得多。

是否可能让C代码执行二进制解析和数字计算,并让Erlang生成进程来运行C代码?


1
一个值得编辑的问题 :P - Drew
2
@Drew 最近更加有条理和简洁了。获得天体工程学位确实有所帮助。 - BAR
9个回答

4
当然,经过优化后,C语言在极端情况下会更快。如果你所指的"更快"是指运行速度更快。
编写方面,使用Erlang绝对比较快。根据你对速度的要求,Erlang可能已经足够快了,并且它能够帮你省去在C语言中寻找错误的几天时间。
只有在经过优化后,C代码才会更快。如果你在C语言和Erlang上花费相同的时间,那么你将得到大致相同的速度(请注意,我在这个时间估计中计算了调试和错误修复所花费的时间,在Erlang中这将会少得多)。
因此:
faster writing = Erlang
faster running (after optimisations) = C
faster running without optimisations = any of the two

随你选。


1
luna:我认为你对Erlang过于乐观了。Erlang是解释性语言,比C运行速度慢得多。它更容易使用多个核心,因此比用C天真编写的程序更具可扩展性。然而,对于基本的数字计算,只需在C中启动X线程,您就可以在任何时候都超越Erlang。无论是否经过优化。有关数字,请参见:http://shootout.alioth.debian.org/u64/benchmark.php?test=all&lang=hipe&lang2=gcc - Toad
1
就像我所说的一样。花相同数量的开发者时间来完成任务。其中包括调试时间,我相信 Erlang 会表现得非常好。这不是因为 Erlang 很快(它并不是),而是因为使用 C 编写和调试很慢,特别是在使用线程和并发性时。 - Daniel Luna

3

根据Erlang FAQ,有两个粗略的经验法则:

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

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

然而,对于Erlang缺乏数字计算性能的问题,有一些官方解决方案:

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

例子:Evedis, Bitcask, ElevelDB

一种从Erlang虚拟机到外部操作系统进程的面向字节的接口,通过标准输入和输出文件描述符进行通信。从Erlang的角度来看,与此端口的通信是通过消息传递实现的。

一个动态链接的C对象文件,加载到Erlang虚拟机中并充当一个端口。从Erlang的角度来看,与此端口驱动程序的通信是通过消息传递实现的。

示例:OTP_Inet, ENanomsg, P1_TLS

您可以将您的Erlang运行时升级为分布式节点。这样,就有了一种在C中实现Erlang运行时并通过单一接口与Erlang节点通信的规范。

所有上述解决方案都有其优缺点,需要极度小心使用。


这绝对是最好的答案。其他的回答都是关于性能的胡言乱语,为什么呢?干得好先生。 - Grigore Madalin

1

1

首先在Erlang中编写整个系统的逻辑,然后使用C实现二进制处理。使用NIF(它是一种与C交互的接口)非常直观且对系统的其余部分透明。这里有另一个关于与C通信的线程 Run C Code Block in Erlang

在攻击C之前,请确保您已经对当前实现进行了基准测试。最新的Erlang/OTP版本(R14)引入了对二进制处理的巨大增强,因此可能会满足您的需求。


1

对于Erlang来说,简单的线程并不是很有趣。简单的线程+消息传递和OTP框架才是Erlang真正强大的地方。如果你需要进行数字计算,请使用像OCaml、Python、Haskell这样的语言。Erlang在数字计算方面并不擅长。

然而,解析二进制文件是Erlang最擅长的事情之一,可能是最擅长的。Joe的书《Programming Erlang》涵盖了所有内容,并且二手价格不贵。它还讲述了如何集成C代码,并给出了一个示例。源代码可以从Pragmatic Programming获取,无需购买该书,你可以使用grep #include或其他方式查找。


1
我猜你的意思是“Erlang在数字计算方面并不擅长。” - Oliver Mason

0

是的,

但有不止一种方法可以做到这一点,粗略地说,其中一些或全部已列出。

我们应该问:

  • 这些过程是否真正等效(ErlangC有何不同)?
  • 是否有更好的方法编写此任务的Erlang(其他过程/库或数据类型)?

考虑阅读此帖子可能会有所帮助:使用Erlang进行扩展和加速


0
回答这个问题,是的,可以让erlang调用一些c函数来处理特定的任务。最常见的方法是使用NIF - http://erlang.org/doc/tutorial/nif.html。在Erlang版本20之前,建议仅将NIF用于短时间运行的函数,因为它们是阻塞的,无法与Erlangs抢占式调度程序配合工作。现在有了脏线程,它更加灵活,您可以了解一下。
只需注意,C可能更快地解析二进制文件,但您应该运行测试,Erlang编写代码的速度远远超过C。 Erlang通过模式匹配很好地解析二进制文件。

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

0

我使用C语言超过20年了。近年来,我几乎完全使用Erlang语言。 由于明显的原因,C运行速度更快。 然而,如果你做得正确,Erlang足够快。 此外,编写Erlang程序更快,更有趣。

对于那些运行时间速度至关重要的算法部分,当然可以用C语言编写,这也是Erlang BIFs的实现方式。


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