当前位置: 首页 > 知识库问答 >
问题:

协议缓冲区首次使用高延迟

咸浩初
2023-03-14

在我们的一个java应用程序中,我们有很多协议缓冲区类,jar本质上公开了一个接口和另一个应用程序使用的一种方法。我们注意到第一次调用这个方法的调用时间相当高(

这一点在另一个应用程序中得到进一步证实,该应用程序的工作方式完全不同,但也使用协议缓冲区,表现出相同的行为。此外,我们还尝试创建一个虚拟实例(XY.newBuilder()。所有proto buffer类在启动时的build())以及我们添加的每个proto buffer类,我们都可以注意到第一次调用丢弃的开销。

在里面NET我可以找到另一个显示类似问题的问题(为什么ProtoBuf在第一次调用时速度很慢,但在循环内速度很快?),然而,那里的解决方案似乎是针对具有预编译序列化程序的C语言的。到目前为止,我在Java中找不到相同的问题。是否有类似于上述问题中所示的适用于java的变通方法?

共有1个答案

邓欣可
2023-03-14

JVM附带了实时(JIT)编译器,它可以对代码进行大量优化。如果您想进一步了解JVM的内部结构,可以深入了解它。将有类加载和卸载、性能概要文件、代码编译和反编译、偏置锁定等。

为了给您一个这样做有多复杂的示例,根据本文,在OpenJDK中有两个编译器(C1和C2),有五个可能的代码编译层:

分层编译有五层优化。它从第0层(解释器层)开始,在该层中,插装提供了有关性能关键方法的信息。很快,第1层即简单的C1(客户机)编译器对代码进行了优化。在第1层,没有分析信息。接下来是第2层,其中只编译了几个方法(同样由客户机编译器编译)。在第2层,对于这几个方法,将为入口计数器和环回分支收集分析信息。然后,Tier 3将看到所有方法都由客户机编译器编译,并提供完整的分析信息,最后Tier 4将利用服务器编译器C2。

这里的要点是,如果您需要可预测的性能,那么您应该始终在每次部署后运行一些虚拟请求来预热代码。

您使用虚拟代码创建所有使用的原型对象是正确的,但您应该更进一步并预热您正在使用的实际方法。

 类似资料:
  • 据我所知,协议缓冲区主要用于控制服务器和客户端代码的项目。我的一般问题是——协议缓冲区能否用于将二进制消息序列化/反序列化到使用现有协议的服务器?所以,我的问题: > 如果协议缓冲区不支持本机微调现有协议的序列化/反序列化方式,那么可以通过扩展添加该功能吗?是否可以以某种方式添加序列化/反序列化方法可以识别的关键字?也许这可以通过扩展或修改protobuf csharp port或protobuf

  • 试图使用Ionic 4中的协议缓冲区进行编码 我已经下载了协议并用它来生成一堆_pb.js文件,每个. proto文件一个。很好。 首先关注原型示例。这是示例代码: 我做了一些更改以匹配我的文件。更改proto文件的名称。但是我的proto文件中没有包名称。所以我只是使用了消息名称。首先这是我的. proto文件的开头: 下面是我修改后的代码: 这似乎不起作用。我的控制台显示: 我相信我已经成功地

  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 我的目标是用扩展名解析协议缓冲区文件。pb。一串在Mac上使用自制软件下载Protobuff。运行protoc--版本,并具有libprotoc 3.1.0版本。 但当我运行Python时,它会说找不到模块。我改变了主意。pb文件名到\u pb2。py并在Python脚本中导入模块。 我正在使用谷歌文档,但仍然没有任何运气。我在编译Protobuf时也遇到了问题。so文件通过Python。我只是无

  • 两者都是序列化库,由谷歌开发人员开发。他们之间有什么大的区别吗?将使用协议缓冲区的代码转换为使用FlatBuffers需要大量工作吗?

  • 在阅读这个相当长的问题之前,我提出了一个bughttps://github.com/GoogleCloudPlatform/python-docs-samples/issues/1103. 原型包和名称解析的留档状态 您可以使用其他定义。通过导入原始文件。导入另一个。在proto的定义中,您可以在文件的顶部添加一条import语句。 我的依赖于annotations.proto将HTTP/JSON