1. 程式人生 > >系統技術非業餘研究 » erl_nif Erlang的ffi 擴充套件erlang的另外一種方法

系統技術非業餘研究 » erl_nif Erlang的ffi 擴充套件erlang的另外一種方法

我們知道擴充套件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的威力和簡單性。
不囉嗦,直接上程式碼:

[email protected]:~/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)
[email protected]
:~/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".

編譯:

[email protected]:~/niftest# gcc -fPIC -shared -o niftest.so niftest.c -I   /usr/local/lib/erlang/usr/include  #你的erl_nif.h路徑

執行:

[email protected]:~/niftest# erl
Erlang R13B03 (erts-5.7.4)  [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]</code>

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的註釋去掉

[email protected]:~/niftest# erl
Erlang R13B03 (erts-5.7.4)  [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:false]</code>

Eshell V5.7.4  (abort with ^G)
1&gt; c(niftest).
{ok,niftest}
2&gt; niftest:hello().
"Hello world!"
3&gt;

綜述: nbif很簡單,而且高效。

Post Footer automatically generated by wp-posturl plugin for wordpress.

相關推薦

系統技術業餘研究 » erl_nif Erlang的ffi 擴充套件erlang另外方法

我們知道擴充套件erl有2種方法, driver和port. 這2個方法效率都低,因為都要經過 port機制,對於簡單的模組,這個開銷有時候是不可接受的。這時候nif來救助了。今天釋出的R13B03已經支援了,雖然是實驗性質的。 erl_nif的代表API functions for an Erl

系統技術業餘研究 » 未公開的erlang ports trace

erlang的trace機制非常強大, 在dbg, ttb模組的配合下, 可以非常清楚的瞭解系統的運作, 排錯, 和調優. 但是有個對於做網路程式重要的功能被忽視了, 沒有寫到文件. 那就是trace ports訊息. 我們的gen_tcp,file都是port實現的, 那麼瞭解這麼模組的運作其實

系統技術業餘研究 » whatsapp深度使用Erlang有感

這麼多年過去了,社群還在討論erlang是不是小眾語言,各種懷疑的時候,whatsapp已經把erlang用到了極致。 whatsapp是什麼? 參見它的 官網 WhatsApp Messenger is a cross-platform mobile messaging app which a

系統技術業餘研究 » 最快的Erlang http hello world 伺服器調優指南 (20Khttp短連結請求/S每桌面CPU)

erl的虛擬機器有2種方式 plain版本的和smp版本的。 smp版本由於鎖的開銷相比要比plain版本的慢很多。而32位機器由於記憶體訪問比64位的少,也會快出很多。所有我選擇在32位的linux系統下調優這個httpd伺服器。這個伺服器就是實現個簡單的功能,在browser下返回hello

系統技術業餘研究 » Literal XML in Erlang with parse_transform/2

One of the things I dislike about Erlang is that it severely impairs bragging opportunities. Yesterday I wrote a module that allows writing literal

系統技術業餘研究 » [Feb 24 2010] Erlang/OTP R13B04 has been released

Erlang/OTP R13B04 has been released. R13B04 is a service release for R13B. There are mostly error corrections, but also some new functionality. This

系統技術業餘研究 » 未公開的erlang:port_s/get_data

我們通常在使用port的時候, 需要把他同其他的上下文關聯起來, 以便在port給我們發生資料的時候, 我們能根據繫結的上下文, 知道如何處理資料. 有2種辦法: 1. 用ets來儲存{Port, Ctx},這個比較慢, 每次都要查表. 2. 用Port本身的空間來儲存Ctx. erlang:po

系統技術業餘研究

ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼

系統技術業餘研究 » MySQL資料庫架構的演化觀察

MySQL資料庫架構的演化觀察 December 14th, 2017 Categories: 資料庫 Tags: mysql

系統技術業餘研究 » inet_dist_connect_options

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 推薦工作機會

最後更新時間:2014/11/28 請賜簡歷至:[email protected], 感謝您對加入我們公司有興趣,我們希望能早日和您共事。 以下幾個職位1年內有效,歡迎內部轉崗:
 資深資料工程師 公司:阿里(核心系統資料庫組) 工作地點:杭州(西溪園區) 崗位描述: 分析雲服務產生的海

系統技術業餘研究 » 新的工作和研究方向

和大家更新下: 做了將近8年資料庫後,我的工作和研究方向將會延伸到虛擬化和計算相關的雲服務,希望能夠和大家一起進步,Happy New Year! 預祝大家玩得開心! Post Footer automatically generated by wp-posturl plugin for w

系統技術業餘研究 » 叢集引入inet_dist_{listen,connect}_options更精細引數微調

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 2017升的最快的幾個資料庫無責任點評

ItPub寫的文章“2017 年度 DB-Engines 資料庫冠軍得主:PostgreSQL 封王!”, 點選 這裡 進一步閱讀 升的最快的幾個資料庫,我簡單的無責任點評: PG資料庫是很老的資料庫,不過這幾年冉冉升起,因為是學院派的,有很好的學術和智力的支援,一直以來在資料庫的體系結構,程式碼

系統技術業餘研究 » Erlang 17.5引入+hpds命令列控制程序預設字典大小

Erlang 17.5釋出引入控制程序預設字典大小的命令列引數: Erlang/OTP 17.5 has been released Written by Henrik, 01 Apr 2015 Some highlights of the release are: ERTS: Added co

系統技術業餘研究 » inet_dist_listen_options

Erlang 17.5版本引入了inet_dist_{listen,connect}_options,對於結點間的互聯socket可以有更精細的控制,RPC的時候效能可以微調: raimo/inet_tcp_dist-priority-option/OTP-12476: Document ke

系統技術業餘研究 » 老生常談: ulimit問題及其影響

ulimit最初設計是用來限制程序對資源的使用情況的,因為早期的系統系統資源包括記憶體,CPU都是非常有限的,系統要保持公平,就要限制大家的使用,以達到一個相對公平的環境。以下是典型的機器預設的限制情況: $ ulimit -a core file size (blocks,

系統技術業餘研究 » 求賢帖

原創文章,轉載請註明: 轉載自系統技術非業餘研究 本文連結地址: 求賢帖 作為一個優秀的工程師,你其實不缺少才華,你缺少的是神一樣的隊友、充滿挑戰的世界級技術難題,和一個可以施展自己才華的大舞臺。加入阿里核心系統資料庫開發團隊吧,你缺的這裡都有。來吧,戳這裡,給我們見識你的機會:http://b

系統技術業餘研究 » Erlang R16B03釋出,R17已發力

Erlang R16B03釋出了,通常03版本是bug fix版本,進入生產版本,官方的說明如下: OTP R16B03 is a service release with mostly a number of small corrections and user contributions. B

系統技術業餘研究 » Erlang R13B04 Installation

R13B04後erlang的原始碼編譯為了考慮移植性,就改變了編譯方式,以下是官方wiki上的安裝文件: 1. Cloning Here are the basic steps to build Erlang/OTP in the Git repository. Start by cloning: