`
616050468
  • 浏览: 10216 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

protobuff的erlang nif封装

阅读更多

    服务器协议一直以来都使用erlang-protobuff,项目地址:https://github.com/ngerakines/erlang_protobuffs,但觉得效率不行,于是想优化一下,思路就是把协议编解码放到底层c去做。正好可以使用云风写的pbc:https://github.com/cloudwu/pbc,于是拿来封装一下nif。虽然看起来很简单,但中间也遇到了一些问题:

1. pbc是非线程安全的,解决办法是初始化时为每个线程创建一个pbc_env环境

2. pbc以字符串key作为消息的字段,但erlang的record结构没有key,只是一个存放term的数组,怎么对应起来

3. c层如何构造一个初始的erlang消息结构,然后解完消息之后,返回给erlang层使用

4. 这个初始的erlang结构都是固定的,怎么把这个erlang结构在c层保存起来一直使用

 

最终做出来效率提升好几倍,而且可以同时支持record和map结构, 代码已提交到github,https://github.com/616050468/erlang_pbc

 

erlang_pbc

erlang_pbc is erlang nif of protobuff-c which is developed by cloudwu, want to know protobuff-c more, please see:https://github.com/cloudwu/pbc

erlang_pbc is faster than erlang-protobuff, support record and map. if you use map, you don't need any erlang code.

Quick Example

package msg;

message attriMessage {
    optional int32 index = 1;
    optional int32 value = 2;
}

message longMessage {
    optional int64 dbID = 1;
    optional int32 sceneID = 2;
    optional int32 sceneLine = 3;
    optional int32 x = 4;
    optional int32 y = 5;
    optional int32 z = 6;
    repeated attriMessage attriList = 7;
    optional string name = 8;
    optional int32 career = 9;
    optional bool sex = 10;
    optional string signature = 11;
    optional int32 vip_level = 12;
    optional string telphone = 13;
}
Eshell V6.1  (abort with ^G)
1> test_msg:init_pbc().
[ok,ok,ok,ok,ok,ok,ok]
2> pbc_nif:get_default("msg.attriMessage").
{{'msg.attriMessage',0,0},#{"index" => 0,"value" => 0}}
3>
3> Bin = pbc_nif:encode("msg.attriMessage", {'msg.attriMessage', 100, 100}).
<<8,100,16,100>>
4>
4> pbc_nif:decode("msg.attriMessage", Bin, 0).
{'msg.attriMessage',100,100}
5>
5> pbc_nif:decode("msg.attriMessage", Bin, 1).
#{"index" => 100,"value" => 100}

Profile

please see test_msg.erl to know more....

test data in personal note-book:

Intel(R) Xeon(R) CPU E3-1231 v3 @3.40GHz
RAM:  8.00GB
OS TYPE: 64-bit
Eshell V6.1  (abort with ^G)
1> test_msg:profile().

begin profile encode 
encode_short_erlang (10.0w): 139ms
encode_short_pbc_map (10.0w): 58ms
encode_short_pbc_record (10.0w): 52ms
encode_long_erlang (10.0w): 850ms
encode_long_pbc_map (10.0w): 187ms
encode_long_pbc_record (10.0w): 152ms
encode_big_erlang (10.0w): 13084ms
encode_big_pbc_map (10.0w): 2203ms
encode_big_pbc_record (10.0w): 1739ms

begin profile decode 
decode_short_erlang (10.0w): 164ms
decode_short_pbc_map (10.0w): 76ms
decode_short_pbc_record (10.0w): 60ms
decode_long_erlang (10.0w): 1342ms
decode_long_pbc_map (10.0w): 424ms
decode_long_pbc_record (10.0w): 175ms
decode_big_erlang (10.0w): 20312ms
decode_big_pbc_map (10.0w): 6099ms
decode_big_pbc_record (10.0w): 2556ms
ok

compile

Windows: open project use VS and build the project.

Linux: (use premake4 to create makefile)

premake4 gmake

分享到:
评论

相关推荐

    rustler编写erlang nif

    【标题】:“rustler编写erlang nif” 在Erlang生态系统中,Native Implemented Functions (NIFs) 是一种机制,允许开发者用其他语言(如C、C++或Rust)编写性能关键部分的代码,然后在Erlang虚拟机(VM)中调用。...

    erlang nif test

    Erlang NIF(Native Implemented Functions)是Erlang虚拟机提供的一种机制,允许开发者用C语言或者其他低级语言编写性能关键部分的代码,并在Erlang系统中无缝调用。这种方式可以充分利用C语言的高效性,同时保持...

    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)崩溃。 该...

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

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

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

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

    esqlite:sqlite的Erlang NIF

    sqlite3的Erlang nif库。 介绍 该库允许您使用来自erlang的出色的sqlite引擎。 该库以nif库的形式实现,可以最快地访问sqlite数据库。 这可能是有风险的,因为nif库或sqlite数据库中的错误可能会使整个Erlang VM...

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

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

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

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

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

    Rustler是一个关键工具,它允许开发人员使用Rust语言安全地构建Erlang的Native Interface (NIF)函数。NIF是Erlang虚拟机(VM)提供的一种机制,使得Erlang代码能够调用C或C++编写的库,从而利用这些语言的高性能特性...

    erl_nif 扩展erlang的另外一种方法

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

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

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

    erlang-tc:Erlang NIF用于threshold_crypto

    **Erlang NIF(Native Implemented Functions) 是Erlang编程语言中的一种机制,它允许开发者集成用其他语言(如C、C++等)编写的代码,以提高性能或利用Erlang VM(虚拟机)不支持的功能。NIFs在Erlang中的主要目的是...

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

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

    **enif_protobuf** 是一个基于 **Erlang NIF (Native Implemented Functions)** 的库,用于集成 **Google Protobuf**,使得在Erlang环境中能够方便地处理和序列化protobuf消息。Erlang NIF是一种机制,允许Erlang...

    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(...

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

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

    druuid:用于 UUID 生成的 Erlang NIF

    德鲁伊概述围绕库的 Erlang NIF 包装器。 目前仅支持 V4 UUID,但即将支持其他版本。建造druuid 存储库包含 OSSP uuid 库的 1.6.2 版。 要构建只需克隆 repo 并键入以下内容:make用法生成一个 v4 uuiddruuid:v4().

    erlang版本的protobuf(erl_protobuffs)

    **protobuf与Erlang** `protobuf`,全称Protocol Buffers,是Google开发的一种数据序列化协议,类似于XML和JSON,但更小巧、快速且高效。它允许开发者定义数据结构,然后生成相应的代码来轻松地读写这些数据,支持...

    dsp:Erlang NIF库,为数字信号处理提供了一系列优化功能

    dsp dsp是一个Erlang NIF库,提供了一系列优化的数字信号处理功能,包括滤波器(IIR,FIR),变换(FFT,IFFT),相关函数,统计信息等等。 该库允许Erlang应用程序在ADI公司的Blackfin处理器上有效地执行信号处理。...

Global site tag (gtag.js) - Google Analytics