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

时间:2011-07-15 14:28:56

标签: java design-patterns serialization reflection mapping

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

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

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

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

4 个答案:

答案 0 :(得分:2)

访问者模式应该非常接近性能。任何涉及序列化的事情都会因为任何类型的通用映射的开销而变得更糟。

我并不是特别熟悉推土机 - 但如果它主要用于自动化手工编写的代码,那么反射就不一定非常重要。也就是说,如果它一次生成一个类(或等效的逻辑树)来定义复制操作,然后重复运行它。反映成本在大量操作中摊销,并且可以忽略不计。

答案 1 :(得分:1)

在一天结束时,您确实需要基准和最低要求。

如果您已满足副本的最短时间要求,则可以避免更改任何代码并继续操作。如果不这样做,当您达到最低要求时,您可以停止。

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

制作一个好的Java基准测试并不是一件非常困难的事情,但是在尝试之前请先阅读它(因为制作一个糟糕的基准测试非常容易)。

答案 2 :(得分:1)

Facade模式的适配器将是一个好主意。你复制数据越少 - 越好。此外,最好使您的数据不可变,以便将来避免并发问题。

我会远离内存序列化,特别是在更改格式时。

同样反映。如果您有很多对象并且不想手动编写适配器,那么使用模型驱动方法并在构建过程中生成所述适配器会好得多。

答案 3 :(得分:0)

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

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

有些人会争辩,因为你没有执行功能,但返回一个复合,然后这将被称为复合或包装或适配器,但不管怎样,我仍然会采用这种方法。

我通常从这里开始:

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