Java培训:如何在Java序列化中获得C++速度

更新时间: 2022-11-10 14:36:59来源: 粤嵌教育浏览量:7181

  对于任何低延迟软件来说,最常见的操作引入最小延迟是至关重要的。例如,在交易软件中,一个常见的、对时间敏感的操作是微服务之间的消息传递。为了最小化通信的内存占用,所有消息都由发送方序列化,由接收方反序列化。因此,从性能的角度来看,序列化/反序列化过程引入最小的延迟是至关重要的。对Java感兴趣的同学,可以参加Java培训来获得知识和技能,以便快速上岗。

  阅读本文,了解更多关于Java中利用C++方法论的低延迟技术:普通的可复制对象和和内存。使普通操作更快一点,从而在聚合操作中节省大量时间。琐碎可复制对象的序列化速度可以比常规Java对象快五倍以上,并且由Chronicle服务等Chronicle库支持。

  

  普通的可复制对象——用Java?

  平凡的可复制对象在C++开发中很常见,但是如果你不熟悉这个术语,一个类比可能有助于展示它们的优势。

  假设你在一家仓库工作,你经常在最后一刻接到两个foo和一个bar的订单,该发货了。foo位于仓库的西边,bar位于东边,因此你需要访问仓库的两端来收集订单。这需要时间。如果对于这种常见的最后一分钟订单,你可以将组件放在一个地方,情况会怎样?然后,无论何时你收到时间紧迫的订单,你都可以快速地收集并发送它们。想掌握 Java 技术的同学不妨报个Java培训班,可以节省学习时间,提高学习效率,在短时间内学有所成,还能找到一份不错的工作。

  将组件保存在一个地方,大致上是普通可复制对象的概念,所有信息都存储在一个连续的内存块中。由于所有数据都在一个位置,因此可以通过一次操作将数据从该存储位置复制到另一个位置。在C++中,这可以使用memcpy来实现,这是复制数据最快的方法。

  常规Java对象包含对对象或非原始数据类型的引用,它们存储在不同的内存位置。复制这样一个Java对象需要多个内存副本,类似于在仓库中跑来跑去。因此,复制Java对象在延迟方面代价很高。

  

  幸运的是,我们可以利用提到的C++方案,使Java序列化更快。关键是创建普通的可复制Java对象,即简单到可以在一次操作中复制的对象。要求?仅使用原始数据字段。因为原语字段具有固定的大小,所以普通的可复制对象的大小是静态的,因此该对象可以存储在单个存储块中。只使用原始数据类型似乎有局限性,但是即使是具有非原始字段的对象也常常可以被转换成普通的可复制对象。

  Chronicle系列化基准

  Chronicle序列化库完全支持Java中的琐碎可复制对象,实现了更快的数据序列化。

  在下面所示的基准测试中,使用了两个微服务应用程序,其中一个通过持久化队列向另一个发送BookUpdates。BookUpdate类要么是一个“普通对象”,带有符号、交换、时间作为String对象和一个请求和出价列表,要么是“普通可复制对象”,这些字段映射到原始字段,如int、long或double字段。在java培训中,有更加系统全面的课程,明确清晰的学习路线,学习起来既轻松,又高效。

  如下文所示,在典型情况下,琐碎可复制对象的序列化和反序列化比常规对象快5倍以上(50%)。所有时间都以微秒为单位。

  普通对象

  

  普通可复制对象

  

  较高的百分位数显示两种变体之间的差异较小,可能与串行化以外的其他事情有关,例如SSD设备延迟。

  这种方法的缺点是什么?

  虽然使用memcpy是有效的,但Java标准将对象如何在内存中布局留给JVM实现者。这意味着不能保证使用一种类型的JVM(例如OpenJDK)发送的对象可以使用另一种类型JVM(如J9)正确接收。然而,对于任何给定的JVM类型,内存布局都是稳定的,因此如果全面使用同一系列JVM,应该不会出现问题。添加集成测试非常容易,确保完全兼容。

  结论

  通过在Java开发中应用琐碎可复制对象的原理,可以显著改善序列化和反序列化的延迟足迹。这类对象的关键原则是,它们只包含原始数据字段,好消息是,即使是非原始数据字段的对象也常常可以转换为普通的可复制对象。Chronicle Services为Java中的琐碎可复制对象提供了独特的支持,与常规Java对象相比,它实现了五倍多的序列化速度。想学习更多 Java 知识和技能,建议参加java培训,课程实时更新,紧跟市场和企业,让你学到最新的java技能,提高市场竞争力。

免费预约试听课