是否可以使用Erlang和C语言混合编程以高比例使用C语言?

问题描述:

我的新作品将使用Elixir语言。是否可以使用Erlang和C语言混合编程以高比例使用C语言?

我在这里也是一个新鲜的Erlang环境。通过一些研究,我发现该平台在CPU密集型计算性能方面存在一些问题。

即使C代码可能比例很高,在上面的情况下用nif代替Erlang可以吗?或者有一些限制,我们无法做到这一点。

+0

见[运行C代码块中的Erlang](http://*.com/q/3525457/2402272)。然而,我不确定这是否能完全回答这个问题,因为我很难解释这个问题的英文。 –

+0

@JohnBollinger,对不起我的英文。我仔细更新了我的问题(也许还有一些问题)。有一些误导,你指的是Erlang能够使用C.但是,我的问题聚焦于高比例使用C. – LoranceChen

+0

这是一个很主观的问题。投票结束。 –

the warning about long-running NIFs in the documentation

如警告文本本手册页的开头所提到的,它是至关重要一个本地函数返回比较快的。很难给出一个原生函数允许工作的确切的最大时间量,但通常一个行为良好的本地函数会在1毫秒内返回给调用者。这可以通过使用不同的方法来实现。如果您完全控制要在本机函数中执行的代码,最好的方法是将工作划分为多个工作块并多次调用本机函数。但是,这并不总是可行的,例如在调用第三方库时。

enif_consume_timeslice()功能可用于通知运行系统有关NIF呼叫的长度。它通常总是被使用,除非NIF执行得非常快。

文档接着提出了三种解决方法,“产生NIF”,“线程化NIF”和“脏NIF”。

+0

这篇文章足以给'nif'留下好印象。 – LoranceChen

从Erlang运行计算密集型C代码的最简单和最安全的方式是将C代码编写为独立可执行文件并通过端口将其连接到Erlang。详情请参阅http://erlang.org/doc/tutorial/c_port.html

+0

似乎可以避免使EVM崩溃为'nif'。但坦率地说,我认为它对我来说并不容易(我是一个新手).BTW,我应该创建C程序的许多端口还是将所有C代码到一个大文件并公开一个端口(形式说明场景,但代码部分)? – LoranceChen

还有第三种方法,您可以将您的c代码作为独立的Erlang节点运行,并通过Erlang internode procotol进行通信。

参见:http://erlang.org/doc/tutorial/cnode.html