From 056d229d10cce478dfe14e5a8881d207b814b6c5 Mon Sep 17 00:00:00 2001 From: SisMaker <1713699517@qq.com> Date: Sun, 29 Mar 2020 11:50:51 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E6=B7=BB=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- c_src/binaryAddr/binaryAddr.c | 15 +++++++++++++++ c_src/binaryAddr/rebar.config | 7 +++++++ src/nifSrc/binaryAddr/binaryAddr.erl | 23 +++++++++++++++++++++++ src/testCase/utTestPerformance.erl | 14 ++++++++++++++ 4 files changed, 59 insertions(+) create mode 100644 c_src/binaryAddr/binaryAddr.c create mode 100644 c_src/binaryAddr/rebar.config create mode 100644 src/nifSrc/binaryAddr/binaryAddr.erl diff --git a/c_src/binaryAddr/binaryAddr.c b/c_src/binaryAddr/binaryAddr.c new file mode 100644 index 0000000..8c4ba9d --- /dev/null +++ b/c_src/binaryAddr/binaryAddr.c @@ -0,0 +1,15 @@ +#include "erl_nif.h" +#include + +static ERL_NIF_TERM getBinAddr(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[]) { + ErlNifBinary bin; + enif_inspect_binary(env, argv[0], &bin); + char buf[256]; + sprintf(buf, "bin: size=%zu, ptr=%p", bin.size, bin.data); + return enif_make_string(env, buf, ERL_NIF_LATIN1); +} +static ErlNifFunc nif_funcs[] = { + {"getBinAddr", 1, getBinAddr} +}; + +ERL_NIF_INIT(binaryAddr, nif_funcs, NULL, NULL, NULL, NULL); \ No newline at end of file diff --git a/c_src/binaryAddr/rebar.config b/c_src/binaryAddr/rebar.config new file mode 100644 index 0000000..29b3607 --- /dev/null +++ b/c_src/binaryAddr/rebar.config @@ -0,0 +1,7 @@ +{port_specs, [ + {"../../priv/binaryAddr.so", ["*.c"]} +]}. + + + + diff --git a/src/nifSrc/binaryAddr/binaryAddr.erl b/src/nifSrc/binaryAddr/binaryAddr.erl new file mode 100644 index 0000000..c6aca8e --- /dev/null +++ b/src/nifSrc/binaryAddr/binaryAddr.erl @@ -0,0 +1,23 @@ +-module(binaryAddr). + +-export([getBinAddr/1]). + +-on_load(init/0). + +init() -> + SoName = + case code:priv_dir(?MODULE) of + {error, _} -> + case code:which(?MODULE) of + Filename when is_list(Filename) -> + filename:join([filename:dirname(Filename), "../priv", "binaryAddr"]); + _ -> + filename:join("../priv", "binaryAddr") + end; + Dir -> + filename:join(Dir, "binaryAddr") + end, + erlang:load_nif(SoName, 0). + +getBinAddr(_Bin) -> + erlang:error({"NIF not implemented in nif_test at line", ?LINE}). \ No newline at end of file diff --git a/src/testCase/utTestPerformance.erl b/src/testCase/utTestPerformance.erl index e0e7871..ea9a716 100644 --- a/src/testCase/utTestPerformance.erl +++ b/src/testCase/utTestPerformance.erl @@ -279,4 +279,18 @@ cddo(N, Bin, Fun) -> nifHashb:Fun(Bin, Bin), cddo(N - 1, Bin, Fun). +cc1(0, A1, A2) -> + A1 / A2; +cc1(N, A1, A2) -> + A1 / A2, + cc1(N - 1, A1, A2). + +cc2(0, A1, A2) -> + A1 div A2; +cc2(N, A1, A2) -> + A1 div A2, + cc2(N - 1, A1, A2). + + +