在我们的一个Java应用程序中,我们有很多协议缓冲器类,该jar文件本质上公开了一个带有一个方法的接口,另一个应用程序使用该方法。我们注意到第一次调用此方法时,调用时间相当长(> 500ms),而后续调用则快得多(<10ms)。起初我们认为这与我们的代码有关,但在分析过后我们无法证实这一点。通过排除法,显然这与协议缓冲器有关。
当我们尝试在不同的应用程序中执行相同的操作,并且完全不同 - 但也使用协议缓冲器 - 显示出相同的行为时,进一步证实了这一点。此外,我们尝试在启动时创建所有proto buffer类的虚拟实例(
在.NET中,我可以找到另一个显示类似问题的问题(为什么ProtoBuf在第一次调用时很慢,但在循环内非常快?),但是那里的解决方案似乎特定于C#,使用预编译序列化程序。到目前为止,我还没有在Java中找到相同的问题。是否有类似上述问题中所示的解决方法适用于Java?
当我们尝试在不同的应用程序中执行相同的操作,并且完全不同 - 但也使用协议缓冲器 - 显示出相同的行为时,进一步证实了这一点。此外,我们尝试在启动时创建所有proto buffer类的虚拟实例(
XY.newBuilder().build()
),并且每次添加每一个实例时,都可以注意到第一次调用的开销会下降。在.NET中,我可以找到另一个显示类似问题的问题(为什么ProtoBuf在第一次调用时很慢,但在循环内非常快?),但是那里的解决方案似乎特定于C#,使用预编译序列化程序。到目前为止,我还没有在Java中找到相同的问题。是否有类似上述问题中所示的解决方法适用于Java?