`
cryolite
  • 浏览: 581550 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

NIF实现的素数求解效率

阅读更多
素数求解,兼谈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.
分享到:
评论
3 楼 xiao_maijia 2010-05-24  
问一个傻瓜的问题,
你在调用erlang的start(M, N)时,
C那边的怎么确定就是int类型的参数呢?
2 楼 xiao_maijia 2010-05-24  
楼主,你能保证你上面的代码是运行通过的?
呜呜
1 楼 mryufeng 2009-11-30  
nif还是执行公平调度的, 如果你的系统繁忙的话, 执行很小的nif函数的时候, 不一定保证会别马上执行。。。

相关推荐

    rustler编写erlang nif

    - 文章通常会包含一个简单的Rust NIF实现,例如计算两个整数的和,展示如何在Rust和Erlang之间传递数据。 - 也会演示如何在Erlang模块中注册和调用这个NIF。 6. **编译与加载**: - 编译Rust代码为动态库,并将...

    erlang nif test

    这通常是一个带有`native`标记的函数,表示它会被NIF实现。 2. **编译C代码**:编写C代码来实现这个函数的功能。C代码需要包含Erlang VM提供的头文件,如`erl_nif.h`,并使用Erlang提供的API来操作Erlang术语(如...

    美国NIF光学规范-RMS梯度的重要性(NIF-GRMS)

    较高的RMS梯度意味着更大的相位变化,这可能导致激光束的聚焦性能下降,从而影响NIF的聚变效率。当激光通过包含长空间波长相位误差的光学元件时,这些误差会累积并可能导致光束质量恶化,最终影响实验结果的精度和可...

    erl_nif_rustler_过程宏写法

    接着,创建一个Rust模块,用于实现NIF。`rustler`提供了`rustler_macro`过程宏,它可以自动生成大部分与Erlang交互所需的样板代码。例如,你可以定义一个名为`my_module`的NIF: ```rust #[macro_use] extern crate...

    erl_nif 扩展erlang的另外一种方法

    erl_nif是Erlang/OTP系统中的一种机制,允许开发者用C语言编写底层代码,然后在Erlang虚拟机(EVM)中直接调用,从而提高性能或实现Erlang无法直接支持的功能。 描述简短地重复了标题中的信息,再次强调erl_nif是...

    上古卷轴 NIF 格式工具集

    上古卷轴 NIF 格式工具集 内包含: 3D模型减面优化软件 MooTools PolygonCruncher 11.02 Win Maya 2016 Nif Plugin Updated 2 3-65421-2-3汉化版+扩展功能 批量自动测定图片转DDS 烘焙法线贴图

    USB.NIF可以解决硬件不能正常工作

    USB.NIF文件是Windows操作系统中一个重要的组件,主要用于支持USB(通用串行总线)设备的正常运行。在描述中提到的问题,当USB.NIF文件缺失或损坏时,可能会导致一系列与USB设备相关的故障,比如无法识别USB设备、...

    3Dmax2012 的nif插件

    能帮出3Dmax导入或导出nif格式文件

    Windows下使用NIF扩展Erlang完整例子

    Windows下使用NIF扩展Erlang完整例子,包含nif工程项目,erlang引用例子。 配套文章:http://blog.csdn.net/mycwq/article/details/17527485

    blender_nif_plugin-blender-2.5.9_politicalgdm_plugin_BoneByBone_

    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的浮与沉

    NIF,这个被世界瞩目、耗资35亿美元以期实现聚变点火的装置,DOE却报告说短期内(1-2年)在NIF上实现点火是不可能的,中期内(5年)也不确定。苦心研究多年的NIF项目就这样付之东流啦?世界上其他正在运行的激光核...

    nifxml:nif.xml文件的存储库,其中包含nif文件格式说明

    4. 性能优化:优化nif文件的结构,减少内存占用和加载时间,提高游戏运行效率。 总之,nif.xml文件是理解nif文件格式的关键,它为开发者提供了宝贵的参考资料。结合nifxml-develop这样的工具或库,我们可以更高效地...

    NIF5002NT3G-VB一款N沟道SOT223封装MOSFET应用分析

    总体而言,NIF5002NT3G-VB是一款适用于便携式设备及类似应用的高效率、低热阻的N沟道MOSFET。其优良的电气特性和封装设计,使其成为电源管理、负载切换以及高效能电路中的理想选择。对于设计者来说,理解和充分利用...

    erlsha2:在Erlang NIF中实现的SHA-224,SHA-256,SHA-384,SHA-512

    在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实现慢...

    SSE NIF Optimizer_汉化版

    传奇版转重制版mod材质转换工具,提供给有需要的玩家及mod开发者

    mjml_nif:MJML Rust实现的Elixir NIF绑定(mrml)

    1. **性能提升**:由于MJML的解析和渲染工作是在Rust中完成的,因此 mjml_nif 可以提供比纯Elixir实现更高的性能,减少了在Elixir虚拟机中的上下文切换和资源消耗。 2. **跨平台兼容性**:Rust库通常具有很好的跨...

    5130美化包,白色nif

    5130美化包,白色nif,超喜欢的,舍不得删

    排版方案和切割方案.nif

    排版方案和切割方案.nif

    bitwise:用于显示Erlang调度程序问题的Erlang NIF示例

    按位:NIF示例显示Erlang调度程序的问题bitwise模块实现了几个Erlang本机实现函数(NIF),旨在显示NIF对Erlang调度程序线程可能产生的几种不同影响。 该模块提供的功能的几个变体exor/2采用一个二进制和一个字节值...

Global site tag (gtag.js) - Google Analytics