在Erlang中,某些常见的库函数比它们的C语言等效函数慢得多。
是否可能让C代码执行二进制解析和数字计算,并让Erlang生成进程来运行C代码?
faster writing = Erlang
faster running (after optimisations) = C
faster running without optimisations = any of the two
随你选。
根据Erlang FAQ,有两个粗略的经验法则:
涉及主要数字计算和数据处理的代码运行速度大约比等效的C程序慢10倍。这包括几乎所有的“微基准测试”。
大型系统花费大部分时间与其他系统通信、从故障中恢复并做出复杂决策,其运行速度至少与等效的C程序一样快。
然而,对于Erlang缺乏数字计算性能的问题,有一些官方解决方案:
在C中实现一个函数,并将其对象代码加载到Erlang虚拟机中,使其像标准Erlang函数一样具有本地性能。
一种从Erlang虚拟机到外部操作系统进程的面向字节的接口,通过标准输入和输出文件描述符进行通信。从Erlang的角度来看,与此端口的通信是通过消息传递实现的。
一个动态链接的C对象文件,加载到Erlang虚拟机中并充当一个端口。从Erlang的角度来看,与此端口驱动程序的通信是通过消息传递实现的。
您可以将您的Erlang运行时升级为分布式节点。这样,就有了一种在C中实现Erlang运行时并通过单一接口与Erlang节点通信的规范。
所有上述解决方案都有其优缺点,需要极度小心使用。
如果你真的想要速度,你应该尝试使用C和C ++的OpenMP或MPI并行编程框架。我建议你查看《Patterns for Parallel Programming》(亚马逊链接),了解OpenMP和MPI编程模式的详细信息。
Erlang ERTS参考手册中的erl_nif部分将会很有帮助。
首先在Erlang中编写整个系统的逻辑,然后使用C实现二进制处理。使用NIF(它是一种与C交互的接口)非常直观且对系统的其余部分透明。这里有另一个关于与C通信的线程 Run C Code Block in Erlang。
在攻击C之前,请确保您已经对当前实现进行了基准测试。最新的Erlang/OTP版本(R14)引入了对二进制处理的巨大增强,因此可能会满足您的需求。
对于Erlang来说,简单的线程并不是很有趣。简单的线程+消息传递和OTP框架才是Erlang真正强大的地方。如果你需要进行数字计算,请使用像OCaml、Python、Haskell这样的语言。Erlang在数字计算方面并不擅长。
然而,解析二进制文件是Erlang最擅长的事情之一,可能是最擅长的。Joe的书《Programming Erlang》涵盖了所有内容,并且二手价格不贵。它还讲述了如何集成C代码,并给出了一个示例。源代码可以从Pragmatic Programming获取,无需购买该书,你可以使用grep #include或其他方式查找。
是的,
但有不止一种方法可以做到这一点,粗略地说,其中一些或全部已列出。
我们应该问:
Erlang
和C
有何不同)?Erlang
(其他过程/库或数据类型)?考虑阅读此帖子可能会有所帮助:使用Erlang进行扩展和加速。
我使用C语言超过20年了。近年来,我几乎完全使用Erlang语言。 由于明显的原因,C运行速度更快。 然而,如果你做得正确,Erlang足够快。 此外,编写Erlang程序更快,更有趣。
对于那些运行时间速度至关重要的算法部分,当然可以用C语言编写,这也是Erlang BIFs的实现方式。