java - Orika vs JMapper - 它是如何工作的以及速度差异 - 为什么?

标签 java mapping orika

我已经下载并测试了这两个映射库。我编写了一个具有 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

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

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

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

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

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

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

关于java - Orika vs JMapper - 它是如何工作的以及速度差异 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22078156/

相关文章:

java - 在 ant 脚本中排除 eclipse 的排除项

java - 如何使用 javassist 实例化在运行时创建的类?

mapping - 使用 automapper 有什么好处?

python - 将部分案例匹配到 Python 字典

orika - 在orika映射器中映射时如何包含或排除属性?

java - 当简单名称和完全限定名称发生冲突时如何引用类

java - JSON解析数组

java - 从带有 Map 的对象到带有属性的 Pojo 的 Dozer 映射

java - Hibernate 在尝试检索数据时抛出错误(分离实体)

java - Orika - 将 Page<T> 映射到 Page<TDto>