Protocol Buffer优化技术-Arena allocation

Protocol Buffer Arena allocation
Arena是pb C++版本才有的特性。用来优化msg创建过程中对内存的使用。
pb版本需要3以上。
 
核心思想:预分配迟回收
好处:
  1. 减少内存分配回收的成本
  2. 缓解碎片对象问题,主要是这个目的
  3. 提高了缓存行的命中率

如何使用

需要在.proto文件中加上下面这行
option cc_enable_arenas = true;
proto在生成时,会为message类生成出arena相关的函数。
import时,也需要带上该选项。

第一种 使用Arena

#include <google/protobuf/arena.h>
Arena arena;
MyMessage* msg= google::protobuf::Arena::CreateMessage<MyMessage>(&arena);
 
arena会分配一块内存使用,不够时采用倍增算法。
默认的初始分配大小是 256B ,最大分配大小是 8KB。每块最大8K。
当arena生命周期结束时,会自动回收内存块。
业务代码不要delete msg这个指针。
可以通过arena.SpaceAllocated() 接口获取实际分配内存的大小。
可以通过arena.SpaceUsed()接口获取实际使用内存的大小。

第二种 自定义内存块

char m_arena_block[1 * 1024 * 1024] = {};
ArenaOptions options;
options.initial_block = m_arena_block;
options.initial_block_size = sizeof(m_arena_block);
Arena arena(options);
auto* message = Arena::CreateMessage<MyMessage>(&arena)
 
第一种由于不知道需要分配多大的内存,所以还是有可能会调用new。
一次性分配1M,足矣。
 
对于string类型和bytes类型,arena特性不生效。
不过,在3.16.0中已经有了ArenaString的实现。
  • Do out-of-line allocation and deallocation of string object in ArenaString.

使用粒度

在大多数服务使用场景中,“arena-per-request”模式表现良好。
建议使用arena,大内存场景下,性能有显著提高。
 
https://github.com/protocolbuffers/protobuf/issues/4327
https://github.com/protocolbuffers/protobuf/tree/3.16.x/src/google/protobuf

原文链接: https://www.cnblogs.com/txtp/p/16035005.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    Protocol Buffer优化技术-Arena allocation

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/188316

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月12日 下午2:09
下一篇 2023年2月12日 下午2:10

相关推荐