Protocol Buffer 首次使用高延迟

2024-02-02

在我们的一个 java 应用程序中,我们有相当多的协议缓冲区类,并且 jar 本质上公开了一个接口,其中包含另一个应用程序使用的一种方法。我们注意到,第一次调用此方法时,调用时间非常长(>500ms),而后续调用则要快得多(

当在不同的应用程序中,工作方式完全不同 - 但也使用协议缓冲区 - 显示相同的行为时,这一点得到了进一步证实。此外,我们尝试创建一个虚拟实例(XY.newBuilder().build())在启动时所有原型缓冲区类以及我们添加的每一个缓冲区类中,我们都可以注意到第一次调用的开销下降。

在.NET中我可以找到另一个显示类似问题的问题(为什么 ProtoBuf 在第一次调用时如此慢,但在循环内却非常快? https://stackoverflow.com/questions/13735248/why-is-protobuf-so-slow-on-the-1st-call-but-very-fast-inside-loops),但是那里的解决方案似乎特定于具有预编译序列化器的 C#。到目前为止我在Java中还没有找到同样的问题。是否有像上面问题中所示的适用于 java 的解决方法?


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

给你一个例子,这会变得多么复杂,根据本文 https://www.infoq.com/articles/OpenJDK-HotSpot-What-the-JIT/,在 OpenJDK 中,有两个编译器(C1 和 C2),具有五种可能的代码编译层:

分层编译有五层优化。它从第 0 层(解释器层)开始,其中仪表提供有关性能关键方法的信息。很快,第一层,即简单的 C1(客户端)编译器,就优化了代码。在第一层,没有分析信息。接下来是第 2 层,其中仅编译少数方法(同样由客户端编译器编译)。在第 2 层,对于这几种方法,收集入口计数器和环回分支的分析信息。然后,第 3 层将看到客户端编译器编译的所有方法以及完整的分析信息,最后第 4 层将利用服务器编译器 C2。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Protocol Buffer 首次使用高延迟 的相关文章

  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • Spring控制器是线程安全的吗

    我遇到了这个控制器示例 想知道它是否是线程安全的 我特别想知道 gson 实例变量 import org springframework stereotype Controller import org springframework we
  • 如何在 Eclipse 中用阿拉伯语读写

    我在 eclipse 中编写了这段代码来获取一些阿拉伯语单词 然后打印它们 public class getString public static void main String args throws Exception PrintS
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • Java 创建浮雕(红/蓝图像)

    我正在编写一个 Java 游戏引擎 http victoryengine org http victoryengine org 并且我一直在尝试生成具有深度的 3D 图像 您可以使用那些红色 蓝色眼镜看到 我正在使用 Java2D 进行图形
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 无法加载 jar 文件的主类

    我使用 Eclipse IDE 开发了一个应用程序 创建应用程序后 我以 jar 格式导出项目 当我尝试运行此 jar 文件时 出现错误 无法加载主类 请帮忙 当您将项目导出为 jar 时 请参阅此所以问题 https stackoverf
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • Android - 除了普通 SSL 证书之外还验证自签名证书

    我有一个通过 SSL 调用 Web 服务的 Android 应用程序 在生产中 我们将拥有由受信任的 CA 签名的普通 SSL 证书 但是 我们需要能够支持自签名证书 由我们自己的 CA 签名 我已经成功实施了接受自签名证书的建议解决方案
  • 使用 Java 在浏览器中下载 CSV 文件

    我正在尝试在 Web 应用程序上添加一个按钮 单击该按钮会下载一个 CSV 文件 该文件很小 大小仅约 4KB 我已经制作了按钮并附加了一个侦听器 文件也准备好了 我现在唯一需要做的就是创建单击按钮时下载 csv 文件的实际事件 假设 fi
  • 所有junit测试后的清理

    在我的项目中 我必须在所有测试之前进行一些存储库设置 这是使用一些棘手的静态规则来完成的 然而 在所有测试之后我不知道如何进行清理 我不想保留一些神奇的静态数字来引用所有测试方法的数量 我应该一直维护它 最受赞赏的方法是添加一些侦听器 该侦
  • 想要开发像 Facebook 这样的网站 - 处理数百万个请求 - 高性能 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想用 Java 开发一个像 Fac
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • 如何移动图像(动画)?

    我正在尝试在 x 轴上移动船 还没有键盘 我如何将运动 动画与boat png而不是任何其他图像 public class Mama extends Applet implements Runnable int width height i
  • 从一个文本文件中获取数据并将其移动到新的文本文件

    我有一个文件 里面有数据 在我的主要方法中 我读入文件并关闭文件 我调用另一种方法 在原始文件的同一文件夹内创建一个新文件 所以现在我有两个文件 原始文件和通过我调用的方法生成的文件 我需要另一种方法 从原始文件中获取数据并将其写入创建的新
  • 使用 eclipse IDE 配置 angularjs

    我想开始使用 AngularJs 和 Java Spring 进行开发 我使用 Eclipse 作为 IDE 我想配置我的 Eclipse 以使这些框架无缝工作 我知道我可能要求太多 但相信我 我已经做了很多研究 你们是我最后的选择 任何帮
  • 尝试使用带有有效购买令牌的 Java Google Play Developer API v3 检索应用内购买信息时出现错误请求(无效值)

    当使用 Java Google Play Developer API 版本 3 并请求有效购买令牌的购买信息时 我收到以下异常 API 调用返回 400 Bad Request 响应以及以下消息 code 400 errors domain

随机推荐

  • 获取单词和空格字符串中的第一个单词 - 空格前的子串第一个单词

    我有一个包含单词和空格的字符串 2h 3m 1s 我想提取2h脱离它 所以在第一个空格之前得到所有的东西 var date 1 340d 1h 15m 52s I want to extract 1 340d 这样做的最佳实践是什么 什么子
  • Firefox 实时 http 标头,缓存控制后的花括号:无缓存

    我正在设置一个 php cURL 脚本来复制我在实时标题中看到的内容 这是一个例子 Cache Control no cache username email protected cdn cgi l email protection pas
  • mysql 在查找和插入时将整数截断为奇怪的数字

    我在 php 中使用 Laravel 的 Eloquent 来插入和查找记录 发生的情况是 当我插入一个整数时 这里是 1001094515039 它会将其更改为 367135071 并将其存储在字段中 字段类型是 Bigint 长度为 2
  • Python 守护进程打包最佳实践

    我有一个用 python 编写的工具 通常应该作为守护进程运行 打包此工具进行分发的最佳实践是什么 特别是应如何处理设置文件和守护进程可执行文件 脚本 相关地 是否有任何通用工具可用于设置守护进程以在启动时运行 以适合给定的平台 即init
  • 如何在flutter插件中导入AAR文件?

    我正在使用 flutter 插件并想要导入 aarandroid 项目中的插件部分 我尝试打开 android 项目并导入 aar通过导入模块来项目 将其包含在setting gradle并将其添加到依赖项中build grade 就像任何
  • 目标文件和共享目标文件之间的关系

    共享对象之间的关系是什么 so 文件和对象 o file 你能通过例子解释一下吗 假设您有以下 C 源文件 将其命名为name c include
  • 从 Firefox Addon 执行 ShellExecute

    在我的 Firefox 扩展中 我想使用 Windows 中该文件类型的 默认查看器 打开某些文件 所以基本上类似于ShellExecute OPEN Windows API 的函数调用 是否可以 如果是这样 如何才能实现这一目标 File
  • parboiled2 和 Spray 导致跨版本后缀冲突

    我试图将 parboiled2 添加为我的项目的依赖项 并遵循计算器示例 但它与喷雾冲突 我现在的build sbt文件包括 io spray spray json 1 3 1 withSources withJavadoc io spra
  • Webpack Sass - 无法解析图像

    我正在尝试通过 webpack 编译我的 Sass 编译正常的 sass 没问题 但出现错误 Module not found Error Can t resolve img twitter svg in Users Steve myweb
  • PHP 解码base64文件内容

    我有一个脚本 可以获取文件的内容并使用 base64 对其进行编码 这个脚本运行良好 现在 我想将内容解码回其原始值 我试过
  • 如何运行批处理文件以隐藏控制台窗口?

    我想在安装完成后启动我成功安装的Java程序 我原则上知道该怎么做 Run FileName app LaunchApp bat Description cm LaunchApp Flags nowait postinstall skipi
  • 如何在执行函数之前等待 Swift 中的变量? (迅速)

    下面是我的代码 我想要我的后字符串中的纬度和经度值 但是当他执行 poststring 时 我的值仍然为零 因为 swift 还没有更新位置 那么在 poststring 获取值之前如何等待纬度和经度呢 我听说过 didset 但我不知道如
  • KeyNotFoundException 信息

    我有一个 C Silverlight 应用程序 它随机抛出一个 KeyNotFoundException 我不知道找不到什么钥匙 这让我想到了两个问题 Does a KeyNotFoundException存储 暴露它试图找到什么密钥 当我
  • 如何判断弹出页面是否打开?

    我正在开发一个 Chrome 扩展程序 我正在寻找如何 从后台页面 找出弹出页面是否打开 我调查了消息传递 http code google com chrome extensions messaging html但我不确定这是否对我有帮助
  • 如何为 ASP.net/C# 应用程序配置文件值中的值添加 & 符号

    我有一个 C 程序 其值位于配置文件中 我想要的是存储 url 值的 符号 例如
  • 为非零值的运行创建组 ID

    我想在向量中找到连续的非零元素 至少由一个零分隔 并为每个组分配一个 ID 后续整数 玩具矢量 value lt c 1 1 2 3 4 3 0 0 0 1 2 3 9 8 0 0 3 2 在此示例中 存在三个非零值 1 1 2 3 4 3
  • 如何链接不同的表单?

    我在第一个问题中得到了很大的帮助 希望有人能告诉我或让我参考有关该主题的早期问题 我想链接不同的表单 就像我单击第一个表单上的按钮一样 它会打开第二个 基本上 我要为手机功能 如短信 通话等 制作一个菜单 所以我希望如果我单击 通话 则会打
  • VIM - 基于搜索正则表达式替换

    我有一个包含多条 1000 多条 记录的文件 例如 lbc3 ssa2 lie1 sld0 ssdasd 我可以通过以下方式找到它们 s w l 0 9 我想要做的是将找到的每个模式的最后部分替换为 我做不到 s s w l 0 9 因为它
  • 如何对齐换行成多行的跨度中的缩进线?

    有谁知道如何对齐第二行 span info margin left 10px color b1b1b1 font size 11px font style italic font weight bold span class info sp
  • Protocol Buffer 首次使用高延迟

    在我们的一个 java 应用程序中 我们有相当多的协议缓冲区类 并且 jar 本质上公开了一个接口 其中包含另一个应用程序使用的一种方法 我们注意到 第一次调用此方法时 调用时间非常长 gt 500ms 而后续调用则要快得多 当在不同的应用