《祁宇-基于C++20+协程的C++20+高性能基础库--雅兰亭库助力开发者构建高性能应用.pdf》由会员分享,可在线阅读,更多相关《祁宇-基于C++20+协程的C++20+高性能基础库--雅兰亭库助力开发者构建高性能应用.pdf(30页珍藏版)》请在三个皮匠报告上搜索。
1、C+20 基础库-雅兰亭库助力开发者构建高性能应用祁宇chufeng.qyalibaba-主要内容 雅兰亭库简介 雅兰亭库序列化库 雅兰亭库rpc 库 雅兰亭库http 库阿里云编译器C+20/23 新特性C+20 基础库(雅兰亭库)Alibaba Cloud Compiler(LLVM)Alibaba Cloud Compiler(ACC)LLVM编译器,相比GCC,或其他Clang/LLVM版本在编译、构建速度上有很大的提升;利用ACCThinLTO、AutoFDO和Bolt等技术可以在不同程度上优化程序性能。通过编译器切换升级到ACC,可以在不用大幅修改代码的情况下获得性能提升和编译速度
2、大幅提升。ACC与C+基础库,为龙蜥社区开发者提供了C+开发的一站式解决方案,快速构建高性能的C+应用。雅兰亭库简介 C+20 雅兰亭库 yaLanTingLibs https:/ 雅兰亭库是一个高性能易用的C+20 库合集,包括这些子库 序列化库(struct_pack,struct_pb,struct_json)基于协程的rpc 库 coro_rpc 基于协程的http库 coro_http_client 协程库async_simple高性能易用的序列化库struct_pack 序列化一个简单对象struct person int64_t id;std:string name;int ag
3、e;double salary;protobuf序列化这样一个对象/person.protomessage person int32 id=1;string name=2;int32 age=3;double salary=4;void serialize_person()person res;res.set_id(1);res.set_name(hello);res.set_age(20);res.set_salary(1024);std:string buf;res.SerializeToString(&buf);高性能易用的序列化库struct_packnamespace boost:s
4、erialization templatevoid serialize(Archive&ar,person&p,const unsigned int)ar&p.id;ar&p.name;ar&p.age;ar&p.salary;/namespace boost:serializationstd:stringstream stream;boost:archive:binary_oarchive archive(stream);person p;archive p;std:string buf=stream.str();boost序列化库序列化person,one by one的去序列化字段高性能
5、易用的序列化库struct_pack struct_pack:一行代码完成对象序列化/反序列化struct person int64_t id;std:string name;int age;double salary;person p.id=1,.name=tom,.age=32;/一行代码序列化auto buffer=struct_pack:serialize(p);/一行代码反序列化person res=struct_pack:deserialize(buffer);enum Color:uint8_t Red,Green,Blue;struct Vec3 float x;float y
6、;float z;struct Weapon std:string name;int16_t damage;struct Monster Vec3 pos;int16_t mana;int16_t hp;std:string name;std:vector inventory;Color color;std:vector weapons;Weapon equipped;std:vector path;/一行代码序列化auto buffer=struct_pack:serialize(monster);/一行代码反序列化auto monster2=struct_pack:deserialize(
7、buffer);不管对象多少字段,一行代码搞定,没有宏,没有DSL,没有任何多余的代码高性能易用的序列化子库struct_pack性能比目前广泛使用的protobuf高一个数量级https:/ protobuf C+17 的实现 比google protobuf 更高效 可以无缝迁移struct_pb 通过protoc 生成protobuf序列化代码monster 场景struct_pb 的性能是google protobuf 的2 倍https:/ 无需手写json代码,一行代码实现对象到jsoncoro_rpc coro_rpc server examplestd:string echo(
8、std:string str);/rpc_service.hstd:string echo(std:string str)return str;/rpc_service.cpp#include#include rpc_service.hint main()register_handler();/register rpc functioncoro_rpc_server server(/*thread_num=*/10,8801);server.start();https:/ rpc_service.h#include Lazy test_client()coro_rpc_client clien
9、t;co_await client.connect(localhost,/*port=*/9000);auto r=co_await client.call(hello coro_rpc);/调用rpc函数std:cout r.result.value()n;/will print hello coro_rpcint main()syncAwait(test_client();api调用很安全,有类型和参数检查;Client只依赖rpc函数的头文件,rpc的实现不会暴露给client;coro_rpc的特色 易用 就像定义普通函数一样定义rpc函数 就像调用本地函数一样调用远程rpc函数 几行
10、代码就可以完成一个rpc服务 用户只需要关注业务逻辑,不用关心底层细节(序列化、路由由框架完成,用户无感知)免安装,包含头文件就可以用 安全 client调用rpc,会在编译期检查做类型和参数的检查 client只依赖rpc函数的头文件,rpc的实现不会暴露给client 高性能(详见benchmark部分)支持任意个数参数int get_value(int a,int b)return a+b;person get_person(person p,int id)return p;int main()register_handler();/注册任意参数类型的普通函数dummy d;regist
11、er_handler(&d);/注册成员函数coro_rpc_server server(/*thread_num=*/10,/*port=*/9000);server.start();struct dummy std:string echo(std:string str)return str;参数的序列化由struct_pack自动完成,用户无感知支持协程rpc函数Lazy get_coro_value(int val)co_return val;int main()register_handler();/注册协程函数coro_rpc_server server(/*thread_num=*
12、/10,/*port=*/9000);server.start();auto client=create_client();auto ret=client.call(42);CHECK(ret.value()=42);coro_rpc benchmark 环境Intel(R)Xeon(R)Platinum 8163 CPU 2.50GHz 96核OS:Linux version 4.9.151-015.ali3000.alios7.x86_64编译器:Alibaba Cloud Compiler(Clang-13)、C+20编译选项:Release O3Benchmark 说明 测试case
13、客户端和服务端都在同一台机器上,使用不同连接数发送请求做echo测试 Pipeline 模式下极限qps 测试 Ping-pong模式下的qps和时延测试 测试备注 brpc由于采用了连接复用,实际上的socket连接数并没有那么多(实际连接数为96),coro_rpc的连接数是实际的连接数。测试客户端统一用coro_rpc的压测客户端测试,压测效果较好,基本能把cpu打满。没有使用brpc测试客户端原因是:如果用brpc客户端压测,brpc qps会降低一倍;grpc的qps始终不会超过10万,故没有放进来做性能比较;目前测试场景仅仅是echo测试,没有测试更多更复杂的场景,测试数据仅供参考
14、;极限qps498756445305454286499977523700000000000250000004B500B1KB5KB10KBQPSMESSAGE SIZE最大压力性能测试(QPS)brpccoro_rpcping-pong qps349540376502523798234372568050000000020000002500000300000
15、03500000400000045000005000000550000QPSPAYLOAD(BYTE)ping-pong QPS测试CORO_RPC QPSBRPC QPSping-pong 时延00.20.40.60.811.208960617281920中位延迟时间(毫秒)客户端连接数量ping-pong测试(负载4B)CORO_RPCBRPC长尾测试 qps0500000000200000025000003000000350000096 192 288 384 480 576 672 768 864
16、960 8641920QPS客户端数量长尾测试 平均 QPSCORO RPCBRPC长尾测试时延00.20.40.60.811.208960617281920延迟时间(毫秒)客户端数量长尾测试 90%延迟时间CORO RPCBRPCcoro_http_client 基于C+20 协程的http(https)client,包含了常用的get/post,websocket,multipart 文件上传,chunked/ranges 下载,redirect,proxy 等常用功能。coro_http_client 以同步方式写异步http请求https:/ you!雅兰亭库社区共建钉钉群