Dav*_*man 3 c language-binding compare elixir beam
我发现Elixir程序可以通过NIF(本机实现的功能)或OS级别的端口运行C代码.阅读过那些和类似的链接,我不是百分之百地知道何时使用一种或另一种方法(或完全不同的其他方法?),并认为对我自己和其他新手进行直接比较会很好.谁能提供?
Yel*_*ple 10
端口基本上是独立的程序,它们与Erlang VM分开运行.Erlang VM通过标准输入/输出与正在运行的端口进行通信,并且生成的端口位于拥有它的Erlang进程后面,可以促进端口与Erlang或Elixir应用程序的其余部分之间的通信.端口是"安全的",因为如果端口崩溃,它不会导致整个Erlang VM崩溃.
瓷器可能是一种可能的改进和扩展,而不是Port模块中已经提供的东西. System.cmd/3还在其底层实现中使用端口.
本机内联函数或"NIF"是在Erlang VM加载的本质上共享库/ DLL中定义的函数,并使用暴露C兼容ABI的某种语言编写.NIF比端口更有效(因为它们不必通过STDIN/ 进行通信STDOUT)并且在许多方面更简单(因为您不必处理Elixir和非Elixir代码库之间的数据编码和解码),但它们'也不那么安全; NIF 可以使Erlang VM崩溃,并且长时间运行的NIF可能会锁定Erlang VM(因为调度程序无法推断本机代码).
端口驱动程序是一种将外部代码与Erlang或Elixir代码库集成的中间方法.与NIF一样,它们被加载到Erlang VM中,因此端口驱动程序可能会崩溃或挂起整个VM.与端口一样,它们的行为与Erlang进程类似.
这里有两个方面的重点:
如果您希望在类似流程的界面背后获得最大安全性,请使用端口.
如果您希望在类似模块的接口背后具有最大的安全性,请使用具有包装System.cmd/3或直接使用端口与外部代码通信的功能的模块
如果您希望在类似流程的界面背后获得更高的效率,请使用端口驱动程序.
如果您希望在类似模块的界面背后提高效率,请使用NIF.
| 归档时间: |
|
| 查看次数: |
1599 次 |
| 最近记录: |