Orika vs JMapper - 它的工作原理和速度差异 - 为什么?

7 java mapping orika

我已经下载并测试了这两个映射库.我编写了一个程序,它有100000个迭代并映射同一个类的bean:

public class IntBean {

    @JMap
    private int int1;
    @JMap
    private int int2;
    .
    .
    .
    @JMap 
    private int int10;
}
Run Code Online (Sandbox Code Playgroud)

在迭代开始之前创建映射器:

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();
Run Code Online (Sandbox Code Playgroud)

每次迭代都是什么:

this.orikaFacade.map(a1, a2);
Run Code Online (Sandbox Code Playgroud)

要么

a2 = (A) this.jmapper2.getDestination(a1);
Run Code Online (Sandbox Code Playgroud)

手绘图:1ms

Orika映射:32ms

手绘图:6ms高速!!!

推土机:1140毫米

我知道,Orika和Jmapper是来自谷歌的优秀图书馆,他们使用的反射方式与Dozer不同,后者速度要慢得多,他们反思以某种方式生成代码.

我有3个问题:

1)它们是如何工作的 - 当代码生成时,在maven构建期间,在运行时 - 每次我在代码中创建映射器时?当我创建映射器时,它们是否会动态更改类代码字节.

2)为什么我注意到这个速度差异?如果以某种方式生成代码,那么为什么会有不同的结果

3)您会选择哪个库?为什么?两者都具有相同的功能?为什么两者都来自谷歌?为什么Google没有开发Orika而是创建了Jmapper?

har*_*ola 7

我不熟悉 Jmapper,所以我将专注于 Orika 和 Dozer

  1. 它们是如何工作的?它们的工作原理不同。Dozer 使用反射,Orika 使用字节码生成。在 maven 构建期间?什么都没有发生,一切都在运行时完成。Dozer 通过其 get 方法访问字段并通过 setter 方法设置目标对象中的值。Orkia 生成字节码来完成这项工作,就像您自己完成了手绘地图一样。第一次转换很慢,之后的每个转换都应该更快。

  2. 推土机,应该始终保持大致相同的速度,依靠反射。Orika,字节码生成,第一次运行在生成映射代码时应该慢很多。

  3. 简短的回答,这取决于。你想映射什么?如果类大致相似,Dozer 非常擅长从一种类型映射到另一种类型。它根本不处理地图。如果您的对象中有 Map,请准备好编写自定义转换器代码

Orika 擅长在相同类型的两个对象之间映射数据。它的某些 List 处理有点奇怪,它将列表视为单个对象而不是单个对象的集合。同样,也准备为此编写一些代码。

两者都不能特别好地处理大型对象图,准备为此编写大量配置。

除非您要在应用程序中进行大量映射,或者需要频繁更改的映射。自己写