在素数求解,兼谈Erlang的性能特性一文中比较了Erlang和Java实现的素数求解效率。
在我的MacBook(Intel Core Duo,2GHz,2GB,Leopard 10.5.8)上,计算1000000以内素数:
Java程序的计算时间大概在2850ms左右。
C程序的计算时间在890ms左右。
Erlang程序的计算时间在3900ms左右
采用NIF方式实现的素数查找,计算时间在900ms左右,效率与C程序的相差无几,确实如愿提高了计算效率。
不过个人觉得像文件操作还是使用Port/Driver比较好的,因为对文件的使用可能是一系列持续的操作过程,文件句柄这样的东西还是比较方便的说,NIF比较适合数学函数这样的简单输入->计算->输出
代码如下:
C代码 收藏代码
#include <stdbool.h>
#include <math.h>
#include "erl_nif.h"
static bool _isPrime(int i)
{
int j;
int t = sqrt(i) + 1;
for (j=2; j<=t; ++j) {
if (i % j == 0)
return false;
}
return true;
}
static ERL_NIF_TERM findPrime(ErlNifEnv *env, ERL_NIF_TERM nterm)
{
int n;
if (!enif_get_int(env, nterm, &n)) {
return enif_make_badarg(env);
}
else {
int i;
ERL_NIF_TERM res = enif_make_list(env, 0);
for (i=2; i<n; ++i) {
if (_isPrime(i)) {
res = enif_make_list_cell(env, enif_make_int(env, i), res);
}
}
return res;
}
}
static ErlNifFunc nif_funcs[] = {
{"findPrime", 1, findPrime}
};
// 宏第一个参数对应着模块名,会被宏自动转换成字符串
ERL_NIF_INIT(prime, nif_funcs, NULL, NULL, NULL, NULL)
编译:
Shell代码 收藏代码
gcc -O3 -fPIC -bundle -flat_namespace -undefined suppress -fno-common -Wall nifprime.c -o nifprime.so -I/usr/local/lib/erlang/usr/include
Erlang代码 收藏代码
-module(prime).
-export([load/0, start/2]).
% 装载Native C
load() ->
erlang:load_nif("nifprime", 0).
start(M, N) ->
statistics(runtime),
L = findPrime(M, 1, N, []),
{_, T} = statistics(runtime),
io:format("total running time: ~p ms ~n", [T]),
io:format("found primes number: ~p~n", [length(L)]).
findPrime(N) ->
% NIF装载后执行Native C程序,若不装载则执行下面的Erlang程序
findPrime(a, 1, N, []).
findPrime(_, N, N, L) ->
L;
findPrime(a, X, N, L) ->
case isPrimeInt(X, 2, trunc(math:sqrt(X) + 1)) of
true -> findPrime(a, X+1, N, [X|L]);
_ -> findPrime(a, X+1, N, L)
end;
findPrime(z, _X, N, _L) ->
findPrime(N).
isPrimeInt(1, _, _) -> false;
isPrimeInt(2, _, _) -> true;
isPrimeInt(X, N, E) when N =< E ->
case X rem N of
0 -> false;
_ -> isPrimeInt(X, N+1, E)
end;
isPrimeInt(_, _, _) -> true.
分享到:
相关推荐
- 文章通常会包含一个简单的Rust NIF实现,例如计算两个整数的和,展示如何在Rust和Erlang之间传递数据。 - 也会演示如何在Erlang模块中注册和调用这个NIF。 6. **编译与加载**: - 编译Rust代码为动态库,并将...
这通常是一个带有`native`标记的函数,表示它会被NIF实现。 2. **编译C代码**:编写C代码来实现这个函数的功能。C代码需要包含Erlang VM提供的头文件,如`erl_nif.h`,并使用Erlang提供的API来操作Erlang术语(如...
在Erlang中,`NIF (Native Implemented Functions)` 是一种机制,允许开发者使用其他语言(如C或Rust)编写高效性能的代码,并在Erlang虚拟机中调用。本篇主要介绍如何利用Rust语言来开发Erlang NIF,并探讨`erl_nif...
示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有任何办法。 入门指南 示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有办法使BEAM(Erlang VM)崩溃。 该...
Windows下使用NIF扩展Erlang完整例子,包含nif工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/17527485
Rust 中的 Erlang NIF 这是一个如何在 Rust 中实现 NIF 的示例。 它对我有用,也可能对你有用,但如果它吃掉了你的作业,请不要生气。 虽然这将是可行的写现实世界的代码下面这个例子,因为整个erl_nif.h接口可用...
在Erlang中,为了实现与C或其他低级语言的高效交互,Erlang提供了一个名为`erl_nif`的接口。本文将深入探讨`erl_nif`,了解它是如何扩展Erlang的功能,并讨论如何使用它来提升性能。 `erl_nif`(Erlang NIF,Native...
(它也提供纯的Erlang实现,尽管它们比C NIF实现慢得多。)它还包括SHA-2函数的HMAC包装器。 有关详细信息,请参见以下链接:只需遵循标准中提供的算法说明,即可编写此处实现的代码。 提供的函数遵循与标准Erlang ...
ErlPuzzle - Erlang 的 libpuzzle NIF Puzzle 库旨在快速找到视觉上相似的图像(gif、png、jpg),即使它们已被调整大小、重新压缩、重新着色或稍微修改。 该库是免费的、轻量级的但非常快速、可配置、易于使用,...
该库以nif库的形式实现,可以最快地访问sqlite数据库。 这可能是有风险的,因为nif库或sqlite数据库中的错误可能会使整个Erlang VM崩溃。 如果您不想冒险,总是可以从单独的erlang节点访问sqlite nif。 特别注意...
盗贼文档|入门|例子Rustler 是一个用安全的 Rust 代码编写 Erlang NIF 的库。这意味着应该没有办法让 BEAM (Erlang VM) 崩溃。该库提供了用于生成与 BEAM 交互的样板的工具,处理 Erlang 术语的编码和解码,并在它们...
**enif_protobuf** 是一个基于 **Erlang ...总之,enif_protobuf是Erlang社区对Google Protobuf的一种强大实现,通过Erlang NIF机制实现了高性能的数据序列化和反序列化,简化了Erlang系统与其他系统之间的数据交换。
通过阅读和研究这些源码,开发者可以深入了解Rustler如何实现Erlang NIF的绑定,以及它是如何处理内存安全和错误管理的。这有助于开发者更好地利用Rustler来提升Erlang或Elixir应用的性能和安全性。
NIFs在Erlang中的主要目的是为了提升处理速度,特别是对于那些在纯Erlang中执行效率低下的计算任务。** 在“erlang-tc”项目中,NIFs被用来实现特定的加密算法或者相关的安全功能,这可能是为了优化性能,因为加密...
wpi - 用于 Raspberry Pi 的 WiringPi 库的 Erlang NIF 此应用程序是围绕库的 Erlang 包装器,该库是 Arduino 的 Wiring 库的 Raspberry Pi 方言。 wpi 使得读取和写入 GPIO 引脚、写入 LCD、移入和移出位或通过...
Erlang emulator 实现分析Erlang emulator 实现分析
在Erlang社区,为了利用protobuf的优势,出现了`erl_protobuffs`,这是一个针对Erlang实现的protobuf库。 **erl_protobuffs的优势** 1. **性能提升**:`erl_protobuffs`经过优化,相比其他Erlang的protobuf实现,...
按位:NIF示例显示Erlang调度程序的问题bitwise模块实现了几个Erlang本机实现函数(NIF),旨在显示NIF对Erlang调度程序线程可能产生的几种不同影响。 该模块提供的功能的几个变体exor/2采用一个二进制和一个字节值...
RE2正则表达式库的Erlang NIF绑定 使用re2 考虑到RE2的差异,该库的API尽可能遵循标准的Erlang / OTP re API。 $ erl 1> re2:run("Bar-foo-Baz", "FoO", [caseless]). {match,[<<"foo">>]} 2> re2:replace(...