Rust: 高性能序列化库Fury PK bincode

在序列化库中,传统的有Json,XML,性能好的有thrift,protobuf等。
对于二进制库来讲,据Fury官网的介绍,Fury性能要远远好于protobuf,且不象protobuf还需要定义IDL(即写.proto文件),非常轻便,随取随用。
此外,bincode是rust的常见的二进制库,也是非常轻巧。今天来比较一下。

今天来尝试一下。

一、cargo.toml
找到对应github官网,地址如下:

https://github.com/apache/fury

1、Fury下载到本地
把对应rust对应文件部分内容(主要包括fury及fury-derive两个文件夹及内容)下载到本地。

(base) PS D:\rust_program> tree
卷 新加卷 的文件夹 PATH 列表
卷序列号为 6E25-CA92        
D:.
├─fury-project
│  └─src
└─rust├─fury│  ├─src│  │  └─row│  └─tests├─fury-derive│  └─src└─tests└─tests

目前Rust Fury库,还是初期,还是建议在github官网中,下载到本地。
其中,上面rust目录下的文件夹及 内容,来自于github Fury项目。

2、toml文件,及Fury对应的Path

cargo.toml文件详细如下:

[package]
name = "fury-project"
version = "0.1.0"
edition = "2021"[dependencies]
fury = { path = "../rust/fury" } # 对应于Fury项目
fury-derive = { path = "../rust/fury-derive" } # 对应于Fury-derive项目
lazy_static ="1.5" # Fury需要
bincode = {version = "1.3.3"} # bincode二进制库
serde ="1.x" # bincode库需要
serde_derive="1" # bincode库需要

在上面,fury,fury-derive,lazy_static对Fury库是必需的;bincode、serde和serde_derive对bincode库是必需的。

在这里插入图片描述
二、main.rs

main.rs如下:


use fury::{from_buffer, to_buffer, Fury};
use std::time::Instant;
use serde_derive::{Serialize,Deserialize};#[derive(Serialize,Deserialize)]
#[derive(Fury,PartialEq,Debug)]
#[tag("bar.foo")]
struct Bar{code:String,date:String,open:f32,high:f32,close:f32,low:f32,volume:f32,amount:f32,is_fq:bool,
}impl Bar{fn default() -> Bar{  Bar{code : String::from("600036.XSHG"),date : String::from("2021-01-05"),open: 19.95,high: 20.02,close: 19.99,low: 19.89,volume: 6900.0,amount: 6900.0 * 19.99,is_fq: false,}}
}#[derive(Fury, Debug, PartialEq)]
#[tag("vec_bar.foo")]
struct VecBar{data: Vec<Bar>,
}
fn main() {let time0 = Instant::now();let bar1   = Bar::default();let bars1 : Vec<Bar>= vec![bar1];let vec_bars = VecBar{data:bars1};let binary_vec_bar: Vec<u8> = to_buffer(&vec_bars);println!("vec_bar serialize  cost time : {:?} seconds",time0.elapsed().as_secs_f32());let time1 = Instant::now();let vec_bar_obj: VecBar = from_buffer(&binary_vec_bar).expect("should success");println!("vec_bar deserialize  cost time : {:?} seconds",time1.elapsed().as_secs_f32());assert_eq!(vec_bars, vec_bar_obj);let time2 = Instant::now();let bars2 = vec![Bar::default() ]; let binary_bars  = to_buffer(&bars2);println!("bars serialize  cost time : {:?} seconds",time2.elapsed().as_secs_f32());let time3 = Instant::now();let bars_obj: Vec<Bar> = from_buffer(&binary_bars).expect("should success");println!("bars deserialize  cost time : {:?} seconds",time3.elapsed().as_secs_f32());assert_eq!(bars2, bars_obj);// bincode 序列化let time4 = Instant::now();let bincode_encoded: Vec<u8> = bincode::serialize(&bars2).unwrap();println!("bars bincode serialize  cost time : {:?} seconds",time4.elapsed().as_secs_f32());let time5= Instant::now();let bincode_decoded: Vec<Bar> = bincode::deserialize(&bincode_encoded[..]).unwrap();println!("bars bincode deserialize  cost time : {:?} seconds",time5.elapsed().as_secs_f32());assert_eq!(bincode_decoded,bars2);// 比较序列化内容println!("bars2序列化内容比较:");println!("Fury库     binary ->: {:?}",binary_bars);println!("Fury库    binary len: {:?}",binary_bars.len());println!("bincode库  binary ->: {:?}",bincode_encoded);println!("bincode库 binary len: {:?}",bincode_encoded.len());}

可以看出,Fury库序列化和反序列化和bincode一样的简洁!就是简单的一行代码。不象protobuf等一样,根本不需要写.proto文件,写build.rs。

三、输出

vec_bar serialize  cost time : 2.47e-5 seconds
vec_bar deserialize  cost time : 2.6e-5 seconds
bars serialize  cost time : 4.3e-6 seconds
bars deserialize  cost time : 2.3e-6 seconds
bars bincode serialize  cost time : 8e-7 seconds
bars bincode deserialize  cost time : 1.4e-6 seconds
bars2序列化内容比较:
Fury库     binary ->: [6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 255, 25, 0, 1, 255, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 98, 97, 114, 46, 102, 111, 111, 118, 154, 59, 33, 255, 11, 0, 192, 178, 6, 72, 255, 11, 0, 133, 235, 159, 65, 255, 13, 0, 11, 54, 48, 48, 48, 51, 54, 46, 88, 83, 72, 71, 255, 13, 0, 10, 50, 48, 50, 49, 45, 48, 49, 45, 48, 53, 255, 11, 0, 246, 40, 160, 65, 255, 1, 0, 0, 255, 11, 0, 184, 30, 159, 65, 255, 11, 0, 154, 153, 159, 65, 255, 11, 0, 0, 160, 215, 69]
Fury库    binary len: 114
bincode库  binary ->: [1, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 54, 48, 48, 48, 51, 54, 46, 88, 83, 72, 71, 10, 0, 0, 0, 0, 0, 0, 0, 50, 48, 50, 49, 45, 48, 49, 45, 48, 53, 154, 153, 159, 65, 246, 40, 160, 65, 133, 235, 159, 65, 184, 30, 159, 65, 0, 160, 215, 69, 192, 178, 6, 72, 0]
bincode库 binary len: 70

1、对于Fury库而言,大家可以比较一下,不同结构序列化和反序列化的性能。结构简单会更好一些。
2、Fury库和bincode库相比,目前看,并没有优势。不管是序列化和反序列化。
3、从序列化的内容对比来看,对应的u8字列向量,Fury的长度为114;而bincode为70.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3224862.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

HTML语言常见标签

语法 HEAD部分的HTML标签 1 标题标签 <title>标题内容</title> 2 段落标签 <meta charset"utf-8"/> BODY部分的HTML标签 1标题标签&#xff08;独占一行&#xff09;<h1>标题内容</h1> 2段落标签&#xff08;独占一行&#xff09;…

禁用华为小米?微软中国免费送iPhone15

微软中国将禁用华为和小米手机&#xff0c;要求员工必须使用iPhone。如果还没有iPhone&#xff0c;公司直接免费送你全新的iPhone 15&#xff01; 、 这几天在微软热度最高的话题就是这个免费发iPhone&#xff0c;很多员工&#xff0c;收到公司的通知。因为&#xff0c;登录公司…

使用Layui实现表格数据的分页功能

最近在用Layui做表格数据的展示时想把所有的数据进行分页展示&#xff0c;于是在网上找了一个模板 <script type"text/javascript" > layui.use([table,layer,form,laypage], function(){var table layui.table,layer layui.layer,form layui.form,laypage…

【ROS2】中级-编写动作服务器和客户端(C++)

目标&#xff1a;用 C实现一个动作服务器和客户端。 教程级别&#xff1a;中级 时间&#xff1a;15 分钟 目录 背景 先决条件 任务 1. 创建 custom_action_cpp 包2. 编写动作服务器3. 编写动作客户端 摘要 相关内容 背景 动作是 ROS 中异步通信的一种形式。动作客户端向动作服务…

LeetCode 203.移除链表元素 C做法

LeetCode 203.移除链表元素 C做法 思路&#xff1a; ​ 由于是单链表&#xff0c;所以我们可以创建一个新的头结点newhead&#xff0c;把不是val的结点尾插在newhead中&#xff0c;而等于val的结点给释放&#xff0c;最后返回newhead。防止时间复杂度过高&#xff0c;我们再创…

数据仓库哈哈

数据仓库 基本概念数据库&#xff08;database&#xff09;和数据仓库&#xff08;Data Warehouse&#xff09;的异同 整体架构分层架构方法论ER模型&#xff08;建模理论&#xff09;维度模型 何为分层第一层&#xff1a;数据源&#xff08;ODS ER模型&#xff09;设计要点日志…

代理详解之静态代理、动态代理、SpringAOP实现

1、代理介绍 代理是指一个对象A通过持有另一个对象B&#xff0c;可以具有B同样的行为的模式。为了对外开放协议&#xff0c;B往往实现了一个接口&#xff0c;A也会去实现接口。但是B是“真正”实现类&#xff0c;A则比较“虚”&#xff0c;他借用了B的方法去实现接口的方法。A…

大小端详解

引例 我们知道整形(int)是4个字节&#xff0c;例如随便举个例子&#xff1a;0x01020304&#xff0c;它一共占了四个地址位&#xff0c;01,02,03,04分别占了一个字节&#xff08;一个字节就对应了一个地址&#xff09;。 那么就会有个问题&#xff1a;我们的01到底是存储在高地…

es是如何处理索引数据的变动的?

1 概述 es是如何处理索引数据的变动的&#xff1f; 或者说索引数据变动时&#xff0c;es会执行哪些操作&#xff1f; refresh、fsync、merge 和 flush 操作有何作用&#xff1f; es是如何确保即使es发生宕机数据也不丢失的&#xff1f; 在回答上述问题前&#xff0c;可以先…

在vue3中,手写父子关联,勾选子级父级关联,取消只取消当前子级,父节点不动

树形控件选择子级勾选父级&#xff0c;以及所有子级&#xff0c; 取消勾选仅取消子级 在项目中&#xff0c;可能会遇到这种场景&#xff0c;比如权限配置的时候&#xff0c;页面权限和菜单权限以tree的形式来配置&#xff0c;而且不用半选&#xff0c;菜单在页面的下面&#xf…

Mosh|初学者 SQL 教程

sql文件链接&#xff1a;链接: https://pan.baidu.com/s/1okjsgssdxMkfKf8FEos7DA?pwdf9a9 提取码: f9a9 在mysql workbench 导入 create_databases.sql 文件&#xff0c;下面是运行成功的界面 快捷方式&#xff1a;全部运行可以同时按下controlcommandenter &#xff0c;或者…

WindowsMac共享文件夹设置

共享文件夹设置 共享文件夹设置Windows系统设置步骤一&#xff1a;设置共享文件夹步骤二: 访问共享文件夹 Mac系统中设置共享文件夹步骤一&#xff1a;设置共享文件夹步骤二&#xff1a;访问共享文件夹 小贴士结论 共享文件夹设置 有时需要在多台电脑之间共享文件夹&#xff0…

如何切换手机的ip地址

在数字时代的浪潮中&#xff0c;智能手机已成为我们日常生活中不可或缺的一部分。然而&#xff0c;随着网络安全问题的日益凸显&#xff0c;保护个人隐私和数据安全变得尤为重要。其中&#xff0c;IP地址作为网络身份的重要标识&#xff0c;其安全性与隐私性备受关注。本文将详…

【深度学习(42)】通过vscode使用anaconda的python环境

按ctrlshiftp&#xff0c;选择Python:Select Interpreter 选择anaconda下的python虚拟环境

物联网实战:STM32+ESP8266温湿度数据采集上传Linux服务器与数据库可视化(附代码示例)

摘要: 本文将手把手教你搭建一个完整的物联网数据监控平台&#xff0c;使用STM32采集温湿度数据&#xff0c;通过ESP8266 WiFi模块上传至Linux服务器&#xff0c;并利用Python脚本将数据存储到MySQL数据库&#xff0c;最后实现每日平均值的计算和可视化展示。 关键词: STM32, …

使用Puppeteer进行数据抓取保存为JSON

Puppeteer简介 Puppeteer是由Google Chrome团队开发的一个Node库&#xff0c;它提供了一个高级API来控制Chrome或Chromium的无头版本。Puppeteer能够执行各种任务&#xff0c;包括页面导航、内容抓取、屏幕截图、PDF生成等。 主要特点 无头浏览器控制&#xff1a;无需打开浏…

0010基于免疫遗传算法的配送中心选址

免疫优化算法&#xff08;Immune Optimization Algorithm, IOA&#xff09;在物流配送中心选址中的应用是通过模拟免疫系统的进化过程来解决选址优化问题。物流配送中心选址问题涉及到如何在给定区域内选择最优的位置&#xff0c;以最大化服务覆盖并最小化运输成本。 免疫优化…

使用昇腾芯片进行多卡训推时使用hccl_tools.py为npu分配ip报错问题解决办法

目录 问题描述问题产生原因解决办法最终执行并验证参考网站命令扩展 问题描述 昇腾芯片&#xff08;910b/310p等&#xff09;进行多卡训练或者推理时需要先获取并配置每张npu的ip信息&#xff0c;因此需要执行类似下面问题&#xff1a; python mindformers/tools/hccl_tools.…

【高等数学】第五章知识点:二重积分

文章目录 一. 二重积分的概念与性质1. 二重积分概念2. 二重积分的性质2.1. 不等式性质2.2. 中值定理 二. 二重积分的计算1. 利用直角坐标计算2. 利用极坐标计算3. 利用函数的奇偶性计算4. 利用变量的轮换对称性计算 一. 二重积分的概念与性质 1. 二重积分概念 几何意义&#x…

Skywork-MoE,1460亿MoE模型,采用MoE Upcycling技术

Skywork-MoE&#xff0c;1460亿MoE模型&#xff0c;采用MoE Upcycling技术 原创 每日发现最新LLM 机器之心SOTA模型 2024年06月04日 18:27 北京 &#x1f3c6; 基座模型 ①项目名称&#xff1a;Skywork-MoE ★Skywork-MoE是一款千亿模型&#xff0c;具有1460亿参数、16个专家…