我们知道扩展erl有2种方法, driver和port. 这2个方法效率都低,因为都要经过 port机制,对于简单的模块,这个开销有时候是不可接受的。这时候nif来救助了。今天发布的R13B03已经支持了,虽然是实验性质的。erl_nif的代表API functions for an Erlang NIF library。 参考文档:
erl_nif.html 和 erlang.html#erlang:load_nif-2 以及 reference_manual/code_loading.html#id2278318
我们来用nif写个最简单的hello, 来展现nif的威力和简单性。
不啰嗦,直接上代码:
root@nd-desktop:~/niftest# cat niftest.c
/* niftest.c */
#include "erl_nif.h"
static ERL_NIF_TERM hello(ErlNifEnv* env)
{
return enif_make_string(env, "Hello world!");
}
static ErlNifFunc nif_funcs[] =
{
{"hello", 0, hello}
};
ERL_NIF_INIT(niftest,nif_funcs,NULL,NULL,NULL,NULL)
root@nd-desktop:~/niftest# cat niftest.erl
-module(niftest).
%-on_load(init/0).
-export([init/0, hello/0]).
init() ->
ok=erlang:load_nif("./niftest", 0), true.
hello() ->
"NIF library not loaded".
编译:
root@nd-desktop:~/niftest# gcc -fPIC -shared -o niftest.so niftest.c -I /usr/local/lib/erlang/usr/include #你的erl_nif.h路径
运行:
root@nd-desktop:~/niftest# erl
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.4 (abort with ^G)
1> c(niftest).
{ok,niftest}
2> niftest:hello().
"NIF library not loaded"
3> niftest:init().
ok
4> niftest:hello().
"Hello world!"
5>
现在重新修改下 niftest.erl 把on_load的注释去掉
利用模块的自动加载机制来自动初始化。
root@nd-desktop:~/niftest# erl
Erlang R13B03 (erts-5.7.4) [source] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]
Eshell V5.7.4 (abort with ^G)
1> c(niftest).
{ok,niftest}
2> niftest:hello().
"Hello world!"
3>
Note: Nbif参与erlang的公平调度, 你调用了nif函数,VM不保证马上调用你的函数实现,而是要到VM认为合适的时候才调用。
综述: nbif很简单,而且高效。
分享到:
- 2009-11-26 01:02
- 浏览 3216
- 评论(7)
- 论坛回复 / 浏览 (7 / 3437)
- 查看更多
相关推荐
在“erl_nif 扩展erlang的另外一种方法.pdf”中,可能详细介绍了以上各步骤的实践指南,包括示例代码和最佳实践。而“更多erlang资料下载.txt”则可能提供了进一步学习Erlang和`erl_nif`的资源链接。 通过`erl_nif`...
总的来说,`erl_nif_rustler`提供了一种更安全、更方便的方式来编写Erlang NIF,避免了直接使用C/C++的复杂性,同时保持了性能优势。通过理解`rustler_macro`的过程宏和Erlang NIF的生命周期,开发者可以轻松地将...
`erl_protobuffs`为Erlang开发者提供了一种高效的protobuf实现,增强了Erlang系统与外部世界的数据交换能力。通过其优化的编码和解码过程,以及对Erlang特性的良好适应,它在处理大量数据时表现出色,是构建高性能、...
erlang-sd_notify-1.0-2.el7.x86_64.rpm
Erlang NIF(Native Implemented Functions)是Erlang虚拟机提供的一种机制,允许开发者用C语言或者其他低级语言编写性能关键部分的代码,并在Erlang系统中无缝调用。这种方式可以充分利用C语言的高效性,同时保持...
在Erlang生态系统中,Native Implemented Functions (NIFs) 是一种机制,允许开发者用其他语言(如C、C++或Rust)编写性能关键部分的代码,然后在Erlang虚拟机(VM)中调用。Rustler是一个库,专门用于简化使用Rust...
dirty_scheduler 不要忘记使用“ --enable-dirty-schedulers”... 从Erlang 17.03开始,enif_schedule_dirty_nif,enif_schedule_dirty_nif_finalizer和enif_dirty_nif_finalizer被删除(erl_nif.h)。 更多信息: :
Rust 中的 Erlang NIF 这是一个如何在 Rust 中实现 NIF 的示例。 它对我有用,也可能对你有用,但如果它吃掉了你的作业,请不要生气。 虽然这将是可行的写现实世界的代码下面这个例子,因为整个erl_nif.h接口可用...
它被实现为erl_tracer NIF,因此需要Erlang / OTP 22.0或更高版本。 Looking Glass的目的是提供一种非常有效的工具,可在开发和生产环境中使用,并且即使在繁忙的系统上也能够长时间运行。在线文件离线文件仍然在线...
RE2正则表达式库的Erlang NIF绑定 使用re2 考虑到RE2的差异,该库的API尽可能遵循标准的Erlang / OTP re API。 $ erl 1> re2:run("Bar-foo-Baz", "FoO", [caseless]). {match,[<<"foo">>]} 2> re2:replace(...
用于 erlang 的 Sybase nif 驱动程序从重写 用法 0.运行二郎erl ebin/ deps/*/ebin % %Start driver 1 > sybdrv : start ([]) % %Execute query with params 2 > sybdrv : execQueryWithArgs ( testdb , " select ...
1. `gen_server`行为:Erlang的`gen_server`行为提供了一种标准方式来实现服务器进程,它包含了一系列的回调函数,如`init/1`(初始化)、`handle_call/3`(处理同步调用)、`handle_cast/2`(处理异步消息)和`...
- 使用Erlang的`erl_nif`调试工具,如`enif_inspect`,来检查NIF的状态。 - 在Elixir测试中,可以模拟NIF失败的情况,确保错误处理逻辑正确。 总结起来,Elixir的FFI是通过NIFs实现的,它允许Elixir代码与C语言库...
当然例外是,如果您的应用程序具有需要本地编译工具链的NIF,但这是用户的一项练习。 尚未做出任何努力来使该映像适合在非特权环境中运行。 存储库所有者对由于不正确的使用或安全实践造成的任何损失不承担任何...