我已经下载并测试了这两个映射库。我编写了一个具有 100000 次迭代并映射同一类的 bean 的程序:
public class IntBean {
@JMap
private int int1;
@JMap
private int int2;
.
.
.
@JMap
private int int10;
}
映射器在迭代开始之前创建:
private JMapper jmapper = new JMapper(IntBean.class, IntBean.class);
private MapperFactory orikaFactory = new DefaultMapperFactory.Builder().build();
private MapperFacade orikaFacade = null;
orikaFactory.registerClassMap(orikaFactory.classMap(IntBean.class,IntBean.class).byDefault().toClassMap());
orikaFacade = orikaFactory.getMapperFacade();
每次迭代的内容:
this.orikaFacade.map(a1, a2);
或
a2 = (A) this.jmapper2.getDestination(a1);
手绘图:1ms
Orika 映射:32 毫秒
手绘图:6 毫秒 极快的速度!!!
推土机:1140 毫秒
我知道,Orika 和 Jmapper 是来自 Google 的很棒的库,它们使用反射的方式与例如 Dozer 不同,Dozer 慢得多,它们以某种方式将反射用于生成代码..
我有 3 个问题:
1) 它们是如何工作的 - 当代码生成时,在 Maven 构建期间,在运行时 - 每次我在代码中创建映射器时?当我创建映射器时,它们是否动态更改类代码字节。?
2) 为什么我注意到这种速度差异?如果以某种方式生成代码,那么为什么会有不同的结果
3) 你会选择哪个图书馆,为什么?两者具有相同的能力?为什么两者都来自谷歌?为什么 Google 不开发 Orika 而创建 Jmapper?
最佳答案
我对Jmapper不熟悉,所以我会专注于Orika和Dozer
它们是如何工作的?它们的工作方式完全不同。 Dozer 使用反射,Orika 使用字节码生成。在 Maven 构建期间?什么都没有发生,这一切都在运行时完成。 Dozer 通过它们的 get 方法访问字段,并通过 setter 方法在目标对象中设置值。 Orkia 生成字节码来完成这项工作,就好像您自己完成了手工映射一样。它在第一次转换时很慢,之后的每次转换都应该更快。
推土机,应该始终以大致相同的速度,依赖于反射。 Orika,字节码生成,第一次运行在生成映射代码时应该慢很多。
简短的回答,视情况而定。你想映射什么?如果类大致相似,Dozer 非常擅长从一种类型映射到另一种类型。它根本不处理 map 。如果您的对象中有 Map,请准备好编写自定义转换器代码
Orika 擅长在相同类型的两个对象之间映射数据。它的某些列表处理方式有点奇怪,它将列表视为单个对象而不是单个对象的集合。同样,也准备为此编写一些代码。
都不能很好地处理大型对象图,准备为此编写大量配置。
除非您要在应用程序中进行大量映射,或者需要经常更改的映射。自己写
关于java - Orika vs JMapper - 它是如何工作的以及速度差异 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078156/