protocol buffer newBuilder速度慢问题

最近的这个项目一直使用protocol buffer作为协议层,大家在使用的过程中发现,每次在创建消息的builder——即newBuilder的时候,会非常的慢(常常需要20ms以上),以至于大家现在基本是谈newBuilder色变的地步。今天亮亮终于忍不住,问我为啥一个builder的创建那么慢呢,我正在玩儿游戏,抽空调出源码来看了一下,发现里面就真是new了一个Builder对象,这个Builder对象也没有那么的复杂,而且构造方法也足够简单,没有逻辑,是啊,我突然回答不了亮亮的问题了。只能说:你等等,我玩儿完游戏研究一下。

仔细思考一下,如果一个类的构造方法里没有什么逻辑,那么就看看它的实例字段、超类字段以及构造方法,挨个查了一遍,发现一个Builder的继承结构是这样的:

看着有些吓人,但是说实话,每一个类中的字段以及构造方法都不会让它的创建超过20ms,那到底问题在哪里?

如果创建不快的话,那么一定是费在了第一次类加载上。为了验证这个推测,我将newBuilder的调用放到了一个循环中,查看每次循环的时间,结果和推测的一样,除了第一次吓人之外,之后基本在毫秒级别都是0。

有了这个验证,那么我们继续证明,将该Builder的加载放到整个测试之外,用Class.forName的方式加载之后再测试,这下就更加明了了,第一次的newBuilder只用了5ms左右,其它的都是0ms级别的。

仔细看了Builder和它的各种父类的定义,全部都是static class,也就是说,在我们真正使用到它之前,JVM确实不会加载它,这也就是为什么它的第一次会非常慢的原因了。

时间: 2024-12-29 19:49:31

protocol buffer newBuilder速度慢问题的相关文章

Android:手把手带你分析 Protocol Buffer使用 源码

前言 习惯用 Json.XML 数据存储格式的你们,相信大多都没听过Protocol Buffer Protocol Buffer 其实 是 Google出品的一种轻量 & 高效的结构化数据存储格式,性能比 Json.XML 真的强!太!多! 由于 Google出品,我相信Protocol Buffer已经具备足够的吸引力 今天,我将讲解Protocol Buffer使用的源码分析,并解决以下两个问题: a. Protocol Buffer序列化速度 & 反序列化速度为何如此快 b. Pr

在NodeJS中玩转Protocol Buffer

Protocol Buffer入门教程 Protocol Buffer是个什么鬼 NodeJS开发者为何要跟Protocol Buffer打交道 在NodeJS中实践Protocol Buffer协议 选择支持protobuf的NodeJS第三方模块 一个栗子 书写proto文件 编译 proto 文件 编写 Writer 编写Reader 运行结果 再举一个栗子 编写proto 编写client 书写server 运行结果 其他高级特性 嵌套Message Import Message 总结一

Netty对Protocol Buffer多协议的支持(八)

Netty对Protocol Buffer多协议的支持(八) 一.背景 在上篇博文中笔者已经用代码演示了如何在netty中使用Protocol Buffer,然而细心的用户可能会发现一个明显的不足之处就是,我们的Handler只能处理一种特定的类型,而我们的项目中又不可能只有一种类型,那么这个问题该怎么解决了?多的不说,笔者直接上代码. 二.代码实现 2.1 message的编写 syntax = "proto2"; package com.rsy.netty.protobuf; op

protocol buffer和当年corba ,和现在SOA有啥异同点

CORBA是对象管理集团(OMG)的一个标准,使得不同语言编写的,运行在不同计算机上的能够协同工作.标准包括分布式计算的通讯协议(GIOP和IIOP),可映射到多种语言的接口描述语言(IDL),对象请求代理(ORB)以及相关服务,如生命周期,全局事务,持久性等. SOA是以可互操作的服务的形式设计和开发软件的一系列原则和方法.SOQ是一种抽象的方法,和具体的技术无关,但是一般来说,涉及Web服务和企业服务总线(ESB)技术有关.下面比较SOA的异同时主要是指这两项技术. Web服务是用来 支持网

protocol buffer介绍(protobuf)

一.理论概述0.参考资料入门资料:https://developers.google.com/protocol-buffers/docs/javatutorial更详细的资料:For more detailed reference information, see the Protocol Buffer Language Guide, the Java API Reference, the Java Generated Code Guide, and the Encoding Reference

Protocol Buffer技术详解(Java实例)

Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发团队中目前主要使用的开发语言就是C++.Java和Python,其中Python主要用于编写各种工具程序.然而为了保证该篇Blog的完整性和独立性,我仍然会将上一篇Blog中已经出现的内容再一次赘述,同时对于Java中特有的部分也会着重介绍.          一.生成目标语言代码.      下面

序列化笔记之一:Google的Protocol Buffer格式分析

从公开介绍来看,ProtocolBuffer(PB)是google 的一种数据交换的格式,它独立于语言,独立于平台.作为一个学了多年通信的人,ProtocolBuffer在我看来是一种信源编码.所谓信源编码,就是将待传输的信源符号经过某种变换,转换成码流进行传输的这个变换过程.信源编码可分为两类:有损编码与无损编码,PB自然是属于无损编码,在无损编码中,又分为定长编码和变长编码,定长编码就是一个符号变换后的码字的比特长度是固定的,比如ASCII.Unicode都是定长编码,码字是8比特,16比特

netty4与protocol buffer结合简易教程

各项目之间通常使用二进制进行通讯,占用带宽小.处理速度快~ 感谢netty作者Trustin Lee.让netty天生支持protocol buffer. 本实例使用netty4+protobuf-2.5.0.在win7下运行.而且如果已经安装jdk和maven. 1.下载并解压protoc-2.5.0-win32.zip和protobuf-2.5.0.zip 2.到protobuf-2.5.0.zip安装文件夹protobuf-2.5.0\java下,运行maven命令:mvn package

【Google Protocol Buffer】Google Protocol Buffer

http://www.ibm.com/developerworks/cn/linux/l-cn-gpb/ Google Protocol Buffer 的使用和原理 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式.它可用于通讯协议.数据存储等领域的语言无关.平台无关.可扩展的序列化结构数据格式.目前提供了 C++.Java.Python 三种语言的 API. 17 评论: 刘 明, 软件工程师, 上海交大电