本文主要是介绍perfetto原理之ProtoZero,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
设计
ProtoZero
是一个零拷贝,零分配,零系统调用的protobuf序列化库,主要用于在Perfetto
里实现跟踪记录.
动机
ProtoZero
设计和充分优化用于proto序列化,并用在Perfetto的所有跟踪路径上. 反序列化主要在稍后的离线处理工具中使用(比如,TraceProcess).零拷贝,零分配,零系统调用主要是在序列化代码中.
Perfetto在跟踪的快速路径中广泛使用protobuf. Perfetto中的每种跟踪事件都是一个proto (TracePacket). 这使得事件是强类型的,使用团队间容易理解的语言并易于保持兼容性.
跟踪的快速路径需要尽可能低的开销,因为插桩代码遍布Android和Chrome的代码之中,性能至关重要.
这里的开销不仅仅指插桩点代码的CPU时间,. 跟踪系统中一个很大的开销来源是由检测点的工作集引入的,特别是额外的I缓存和D缓存未命中,这将减慢跟踪检测点之后的非跟踪代码的速度。
ProtoZero与libprotobuf等规范C++protobuf库的主要设计差异如下:
- 将序列化和反序列化看作是不同的应用场景的不同代码
- 优化序列化路径上的二进制大小和工作集大小.
- 忽略protobuf的大多数错误检查和长尾特性(重复与可选、完整类型检查)。
- ProtoZero不是为了设计为通用的protobuf序列化和反序列化功能,而是采用了大量定制的手段,以将跟踪写入代码保持在最低销耗,并允许编译器查看其体系结构层。
- ProtoZe
这篇关于perfetto原理之ProtoZero的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!