繁体   English   中英

在 Java 对象之间复制数据的最快方法是什么?

[英]What would be the fastest way of copying data between Java objects?

我有各种 Java 对象集,其中一些是从 JAXB 工具生成的 pojo,其中一些是域类等。在大型应用程序中,我需要从一组对象中获取数据并放入另一组具有不同的对象使用数据的能力。

有多种方法可以做到这一点:object 映射框架是一个明显的选择。 但是,大多数具有可靠代码库和社区的框架都使用反射。(例如推土机)

我一直在使用采用 pojos 和更复杂的 java 类来访问访问者模式的适配器组合,以便在适配器上行走的访问者走过一组对象,并在此过程中创建另一组对象(对象通常具有父/子/树类型的引用)特别是当使用引用传递而不是创建新的字符串等时,这应该是最快的方法。

你能想到其他方法吗? 对 memory 中的字节数组进行某种序列化,然后可能是反序列化? 它能否在性能方面击败基于访问者的副本? 我对像 Dozer 这样的基于反射的方法不公平吗? 这是应用程序中的关键操作,因此任何改进都可能显着提高整体性能。

访问者模式应该非常接近最佳性能。 由于任何类型的广义映射的开销,任何涉及序列化的事情都会变得更糟。

我对推土机并不特别熟悉——但是如果反射本质上用于自动化你正在手工编写的代码,它就不必如此受欢迎; 也就是说,如果它一次生成 class (或等效的逻辑树)来定义复制操作,然后重复运行。 反射成本在大量操作中摊销,变得可以忽略不计。

归根结底,您确实需要基准和最低要求。

如果您已经满足复制的最低时间要求,则可以避免更改任何代码并继续前进。 如果你不这样做,当你满足最低要求时,你可以停止。

对于每一种“快速”方式,总有一些其他方式可能会更快一些。 快速说明最低要求会告诉您这是否需要快速(或者您只是过早地优化)以及何时停止投入资源以使其更快。

制作一个好的 java 基准测试并不太难,但在尝试之前一定要阅读它(因为制作一个糟糕的基准测试非常容易)。

Facade 模式的适配器将是一个好主意。 您复制数据的次数越少 - 越好。 此外,让您的数据不可变也是一个好主意,这样您就可以避免将来出现并发问题。

我会远离内存中的序列化,尤其是在改变格式的情况下。

反思也是如此。 如果您有很多对象并且不想手动编写适配器,最好使用 model 驱动方法并生成所述适配器作为构建过程的一部分。

如果您关心的只是传输数据,而不是实际创建来自两个不同类的字段的复合 object,那么我建议使用外观。 外观将您分派到几个不同的对象中,并从这两个对象中返回一个数据传输 object (DTO)。

http://en.wikipedia.org/wiki/Facade_pattern

有些人会争辩说,因为您没有执行功能,而是返回复合,所以这将被称为复合或包装器或适配器,但无论哪种方式,我仍然会使用这种方法 go。

我通常从这里开始:

http://www.javacamp.org/designPattern/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM