在
素数求解,兼谈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比较适合数学函数这样的简单输入->计算->输出
代码如下:
#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)
编译:
gcc -O3 -fPIC -bundle -flat_namespace -undefined suppress -fno-common -Wall nifprime.c -o nifprime.so -I/usr/local/lib/erlang/usr/include
-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术语(如...
较高的RMS梯度意味着更大的相位变化,这可能导致激光束的聚焦性能下降,从而影响NIF的聚变效率。当激光通过包含长空间波长相位误差的光学元件时,这些误差会累积并可能导致光束质量恶化,最终影响实验结果的精度和可...
接着,创建一个Rust模块,用于实现NIF。`rustler`提供了`rustler_macro`过程宏,它可以自动生成大部分与Erlang交互所需的样板代码。例如,你可以定义一个名为`my_module`的NIF: ```rust #[macro_use] extern crate...
erl_nif是Erlang/OTP系统中的一种机制,允许开发者用C语言编写底层代码,然后在Erlang虚拟机(EVM)中直接调用,从而提高性能或实现Erlang无法直接支持的功能。 描述简短地重复了标题中的信息,再次强调erl_nif是...
上古卷轴 NIF 格式工具集 内包含: 3D模型减面优化软件 MooTools PolygonCruncher 11.02 Win Maya 2016 Nif Plugin Updated 2 3-65421-2-3汉化版+扩展功能 批量自动测定图片转DDS 烘焙法线贴图
USB.NIF文件是Windows操作系统中一个重要的组件,主要用于支持USB(通用串行总线)设备的正常运行。在描述中提到的问题,当USB.NIF文件缺失或损坏时,可能会导致一系列与USB设备相关的故障,比如无法识别USB设备、...
能帮出3Dmax导入或导出nif格式文件
Windows下使用NIF扩展Erlang完整例子,包含nif工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/17527485
plugin for blender Version 2.5.9 (26 Nov 2012)==============================* Import normals if present for the Blender True Normals patch (requested by kormgar).* New import option to disable bone ...
NIF,这个被世界瞩目、耗资35亿美元以期实现聚变点火的装置,DOE却报告说短期内(1-2年)在NIF上实现点火是不可能的,中期内(5年)也不确定。苦心研究多年的NIF项目就这样付之东流啦?世界上其他正在运行的激光核...
4. 性能优化:优化nif文件的结构,减少内存占用和加载时间,提高游戏运行效率。 总之,nif.xml文件是理解nif文件格式的关键,它为开发者提供了宝贵的参考资料。结合nifxml-develop这样的工具或库,我们可以更高效地...
总体而言,NIF5002NT3G-VB是一款适用于便携式设备及类似应用的高效率、低热阻的N沟道MOSFET。其优良的电气特性和封装设计,使其成为电源管理、负载切换以及高效能电路中的理想选择。对于设计者来说,理解和充分利用...
在Erlang NIF中实现的SHA-224,SHA-256,SHA-384,SHA-512。描述erlsha2库应用程序使用Erlang NIF实施SHA-2安全哈希标准(SHA-224,SHA-256,SHA-384,SHA-512)。 (它也提供纯的Erlang实现,尽管它们比C NIF实现慢...
传奇版转重制版mod材质转换工具,提供给有需要的玩家及mod开发者
1. **性能提升**:由于MJML的解析和渲染工作是在Rust中完成的,因此 mjml_nif 可以提供比纯Elixir实现更高的性能,减少了在Elixir虚拟机中的上下文切换和资源消耗。 2. **跨平台兼容性**:Rust库通常具有很好的跨...
5130美化包,白色nif,超喜欢的,舍不得删
排版方案和切割方案.nif
按位:NIF示例显示Erlang调度程序的问题bitwise模块实现了几个Erlang本机实现函数(NIF),旨在显示NIF对Erlang调度程序线程可能产生的几种不同影响。 该模块提供的功能的几个变体exor/2采用一个二进制和一个字节值...