msgpack,fmtlib和RPClib库的介绍及使用

 msgpack简介 

MsgPack 是一种高效的二进制序列化格式。官方对msgpack地道的介绍:——It's like JSON,but fast and small.

官网地址:MessagePack: It's like JSON. but fast and small.

github地址:GitHub - msgpack/msgpack-c at cpp_master

像JSON一样,跨平台、跨操作系统、支持多种语言,在多种语言之间使用,高效压缩。
msgpack会将数据打包成二进制的数据,它的数据格式与json类似,但是在存储时对数字、多字节字符、数组等都做了很多优化。减少了无用的字符,二进制格式,也保证不用字符化带来额外的存储空间的增加,所以在很大程度上减少来传输数据的大小。

msgpack序列化方式在某些场合下有用,可以替代json,实现简单高效的消息传输,接口可以泛化变得通用,只是消息的可读性差。

msgpack使用

#include <vector>
#include <string>
#include <iostream>
#include <msgpack.hpp>

//定义命令
#define COMMAND_GET_INFO 0x01

//自定义请求类
class MyClass {
public:
    std::string m_str;
    std::vector<int> m_vec;
public:
    MSGPACK_DEFINE(m_str, m_vec);
};

int main() {
	//参数初始化
    MyClass my_request;
    my_request.m_str ="Hello MsgPack";
    my_request.m_vec.push_back(100);

    std::tuple<int, MyClass, std::string> send_msg(COMMAND_GET_INFO, my_request, "Addition Data");
	
	//序列化组包
    msgpack::sbuffer sbuf;
    msgpack::pack(sbuf, send_msg);

	//网络传送使用字符串作为消息
    std::string str(sbuf.data());

	//反序列化解包
    msgpack::object_handle oh = msgpack::unpack(str.data(), str.size());
    msgpack::object deserialized_object = oh.get();
	//转换
    std::tuple<int, MyClass, std::string> recv_msg;
    deserialized_object.convert(recv_msg);
    
	//打印
    std::cout << std::get<0>(recv_msg)<< std::endl;
    std::cout << std::get<1>(recv_msg).m_str<< std::endl;
    std::cout << std::get<2>(recv_msg)<< std::endl;
}

fmtlib简介

GitHub - fmtlib/fmt: A modern formatting library

fmtlib很有名,在github上14.k的星星了,被好多项目使用。

它也进入了C++20的标准库(std::format),可以算是C++字符串格式化的未来。

C 标准库中的 printf 类函数, 实际上是非常广泛使用的。它主要的问题应该是不安全 (既不类型安全, 也可能造成缓冲区的溢出), 以及无法拓展 (无法兼容用户类型)。

C++ 的流式 I/O的cout 之类的做到了类型安全, 也做到了拓展性, 但使用起来比较麻烦. 而就其实现上来说, 效率也并不见得高。

因此fmtlib诞生了!

fmtlib使用

它可以这样使用,格式化输出:

fmt::print("Elapsed time: {0:.2f} seconds", 1.23);
fmt::print(stderr, "Don't {}!", "panic");
fmt::print("{:.2f}",0);
std::vector<int> v = {1, 2, 3};
fmt::print("{}", fmt::join(v, ", "));

这样格式化变得非常的方便了。安全性效率实际上也很高。

fmtlib 主要提供了两类 API, 除了刚刚说的 fmt::print, 还有 fmt::format 函数. fmt::format 任务就是把格式化输出到 std::string 里面.

fmt::format 基本上实现了 std::format 的大部分任务. 但标准库中没有吸收 fmt::print, 所以标准中格式化输出给的例子是 std::cout << std::format(...) 这样的操作。

fmt::print 是比 "fmt::format 之后再输出到屏幕上" 效率高的。

目前来看 fmt::print 和 fmt::format 都会在栈上开一个大的缓冲区 (500 字符长, 可动态扩容), 格式化写进去以后, 再复制到屏幕上/字符串中. 所以用 fmt::format 输出会比 fmt::print 多一步生成 std::string 的过程. 使用栈上内存比用堆上内存代价低很多, 可以节省一些时间. 这个其实就是一个大号的 SSO (短字符串优化)。

此外 fmtlib 还有给输出加上颜色的功能 (通过特定的控制字符, 需要终端配合), 还有安全的 printf 实现, 用户定义的 operator<< 支持等功能。使用上跟Python的format有点儿像。

此外fmtlib元编程还是用的很好的 想学元编程,看这个源代码基本上可以成专家了。

fmtlib确实完美符合了C++的性能哲学:类型安全,零成本抽象。

fmtlib效率也是杠杠的。 

RPClib简介

RPClib是一个现代的C++ MsPACKE RPC服务器和客户端库。它使用了msgpack和C++ 格式化输出库 cppformat(现在改名为fmtlib)

rpclib是C++的RPC库,提供客户端和服务器实现。它是使用现代C++ 14构建的,因此需要一个最近的编译器。主要亮点:

  • 公开要通过RPC调用的程序函数(来自实现msgpack-rpc的任何语言)
  • 通过RPC调用函数(任何语言编写的程序)
  • 没有IDL可学
  • 在代码生成中没有代码生成步骤,只需C++

RPClib简单使用

server端,当srv.run()被调用时,rpclib启动服务器循环,该循环监听传入的连接并尝试将调用分派到绑定函数。函数从调用run的线程调用。还有一个async_run生成工作线程并立即返回。

// Server端
#include <iostream>
#include "rpc/server.h"

void foo() {
    std::cout << "foo was called!" << std::endl;
}

int main(int argc, char *argv[]) {
    // Creating a server that listens on port 8080
    rpc::server srv(8080);

    // Binding the name "foo" to free function foo.
    // note: the signature is automatically captured
    srv.bind("foo", &foo);

    // Binding a lambda function to the name "add".
    srv.bind("add", [](int a, int b) {
        return a + b;
    });

    // Run the server loop.
    srv.run();

    return 0;
}

client端:

// client端
#include <iostream>
#include "rpc/client.h"

int main() {
    // Creating a client that connects to the localhost on port 8080
    rpc::client client("127.0.0.1", 8080);

    // Calling a function with paramters and converting the result to int
    auto result = client.call("add", 2, 3).as<int>();
    std::cout << "The result is: " << result << std::endl;
    return 0;
}


引用

22.5-msgpack使用 - 简书

C++ 格式化输出库 fmtlib - 知乎

msgpack c++的使用_水墨长天的博客-CSDN博客_c++ msgpack

C++数据序列化之MessagePack_tropicofcancer9的博客-CSDN博客_c++ msgpack

msgpack使用_I天辉I的博客-CSDN博客

fmtlog:比NanoLog更快的fmtlib风格C++日志库 - 知乎

msgpack 原理_aalbertini的博客-CSDN博客_msgpack

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Msgpack和Protobuf都是高性能的序列化反序列化,它们都具有良好的性能和可扩展性,但是它们的实现方式和特点略有不同。 1. 编码方式:Msgpack使用了类似于JSON的编码方式,即将数据序列化成二进制流,可以节省传输的带宽和存储空间;而Protobuf使用了二进制编码方式,采用了一些高效的编解码算法,可以提高编解码的速度。 2. 序列化反序列化性能:在序列化反序列化性能方面,Msgpack通常比Protobuf更快,因为它的编解码方式比Protobuf更简单,数据格式更轻量级。但是在实际应用中,Msgpack的性能与数据大小、数据结构复杂度等因素有关,不一定在所有场景下都比Protobuf更快。 3. 跨平台支持:Msgpack支持多种编程语言,可以在不同的操作系统和硬件平台上使用;而Protobuf也支持多种编程语言,但是在某些平台上可能存在兼容性问题。 4. 可扩展性:Msgpack的可扩展性比较好,可以通过向已有的数据结构中添加新的字段来扩展数据结构,而不会影响已有的数据结构和代码;而Protobuf的可扩展性也很好,可以通过向已有的数据结构中添加新的字段来扩展数据结构,但是需要进行版本控制,以确保数据的兼容性。 综上所述,Msgpack和Protobuf都是高性能的序列化反序列化,可以根据具体的应用场景和需求来选择合适的。如果需要轻量级、高效的数据交换格式,可以选择Msgpack;如果需要更多的特性和可扩展性,可以选择Protobuf。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值