`
轮回记忆
  • 浏览: 10467 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

erlang 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比较适合数学函数这样的简单输入->计算->输出

代码如下:
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. 
分享到:
评论

相关推荐

    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术语(如...

    erl_nif_rustler_过程宏写法

    在Erlang中,`NIF (Native Implemented Functions)` 是一种机制,允许开发者使用其他语言(如C或Rust)编写高效性能的代码,并在Erlang虚拟机中调用。本篇主要介绍如何利用Rust语言来开发Erlang NIF,并探讨`erl_nif...

    rustler —用于创建Erlang NIF函数的安全Rust桥-Rust开发

    示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有任何办法。 入门指南 示例Rustler是一个用于以安全的Rust代码编写Erlang NIF的库。 这意味着应该没有办法使BEAM(Erlang VM)崩溃。 该...

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

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

    erlang-rust-nif:在 Rust 中实现的 Erlang NIF 示例

    Rust 中的 Erlang NIF 这是一个如何在 Rust 中实现 NIF 的示例。 它对我有用,也可能对你有用,但如果它吃掉了你的作业,请不要生气。 虽然这将是可行的写现实世界的代码下面这个例子,因为整个erl_nif.h接口可用...

    erl_nif 扩展erlang的另外一种方法

    在Erlang中,为了实现与C或其他低级语言的高效交互,Erlang提供了一个名为`erl_nif`的接口。本文将深入探讨`erl_nif`,了解它是如何扩展Erlang的功能,并讨论如何使用它来提升性能。 `erl_nif`(Erlang NIF,Native...

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

    (它也提供纯的Erlang实现,尽管它们比C NIF实现慢得多。)它还包括SHA-2函数的HMAC包装器。 有关详细信息,请参见以下链接:只需遵循标准中提供的算法说明,即可编写此处实现的代码。 提供的函数遵循与标准Erlang ...

    erlpuzzle:Erlang NIF 到 libpuzzle,一个快速查找视觉相似图像的库

    ErlPuzzle - Erlang 的 libpuzzle NIF Puzzle 库旨在快速找到视觉上相似的图像(gif、png、jpg),即使它们已被调整大小、重新压缩、重新着色或稍微修改。 该库是免费的、轻量级的但非常快速、可配置、易于使用,...

    esqlite:sqlite的Erlang NIF

    该库以nif库的形式实现,可以最快地访问sqlite数据库。 这可能是有风险的,因为nif库或sqlite数据库中的错误可能会使整个Erlang VM崩溃。 如果您不想冒险,总是可以从单独的erlang节点访问sqlite nif。 特别注意...

    用于创建 Erlang NIF 函数的安全 Rust 桥

    盗贼文档|入门|例子Rustler 是一个用安全的 Rust 代码编写 Erlang NIF 的库。这意味着应该没有办法让 BEAM (Erlang VM) 崩溃。该库提供了用于生成与 BEAM 交互的样板的工具,处理 Erlang 术语的编码和解码,并在它们...

    enif_protobuf:使用enif(Erlang nif)的Google Protobuf实现

    **enif_protobuf** 是一个基于 **Erlang ...总之,enif_protobuf是Erlang社区对Google Protobuf的一种强大实现,通过Erlang NIF机制实现了高性能的数据序列化和反序列化,简化了Erlang系统与其他系统之间的数据交换。

    rustler:用于创建Erlang NIF函数的Safe Rust桥

    通过阅读和研究这些源码,开发者可以深入了解Rustler如何实现Erlang NIF的绑定,以及它是如何处理内存安全和错误管理的。这有助于开发者更好地利用Rustler来提升Erlang或Elixir应用的性能和安全性。

    erlang-tc:Erlang NIF用于threshold_crypto

    NIFs在Erlang中的主要目的是为了提升处理速度,特别是对于那些在纯Erlang中执行效率低下的计算任务。** 在“erlang-tc”项目中,NIFs被用来实现特定的加密算法或者相关的安全功能,这可能是为了优化性能,因为加密...

    wpi:用于 Raspberry Pi 的 WiringPi 库的 Erlang NIF

    wpi - 用于 Raspberry Pi 的 WiringPi 库的 Erlang NIF 此应用程序是围绕库的 Erlang 包装器,该库是 Arduino 的 Wiring 库的 Raspberry Pi 方言。 wpi 使得读取和写入 GPIO 引脚、写入 LCD、移入和移出位或通过...

    Erlang emulator 实现分析

    Erlang emulator 实现分析Erlang emulator 实现分析

    erlang版本的protobuf(erl_protobuffs)

    在Erlang社区,为了利用protobuf的优势,出现了`erl_protobuffs`,这是一个针对Erlang实现的protobuf库。 **erl_protobuffs的优势** 1. **性能提升**:`erl_protobuffs`经过优化,相比其他Erlang的protobuf实现,...

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

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

    re2:RE2正则表达式库的Erlang NIF绑定

    RE2正则表达式库的Erlang NIF绑定 使用re2 考虑到RE2的差异,该库的API尽可能遵循标准的Erlang / OTP re API。 $ erl 1&gt; re2:run("Bar-foo-Baz", "FoO", [caseless]). {match,[&lt;&lt;"foo"&gt;&gt;]} 2&gt; re2:replace(...

Global site tag (gtag.js) - Google Analytics