【问题标题】:Converting Map to Java object using Jackson Object Mapper is very slow使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢
【发布时间】:2017-07-22 08:50:00
【问题描述】:

我目前正在尝试使用 Jackson 数据绑定库从 Map 创建 52 个 Java 对象,目前转换所有 52 个对象总共需要 3.518 秒,这似乎很慢。我不确定为什么会这样。这是异常情况还是可以采取一些措施来加快这些转换?

这是我的 Java 对象类:

public class MoodDatapoint extends DocumentModelHelper {

    @JsonProperty(value = "happiness")
    private int happiness;

    @JsonProperty(value = "stress")
    private int stress;

    @JsonProperty(value = "pain")
    private int pain;

    @JsonProperty(value = "timestamp")
    private long timestamp;

    @JsonProperty(value = "lat")
    private double lat;

    @JsonProperty(value = "lng")
    private double lng;

    @JsonProperty(value = "comment")
    private String comment;

    @JsonProperty(value = "event_name")
    private String eventName;

    @JsonProperty(value = "is_before")
    private boolean isBefore;

    @JsonProperty(value = "related_event_id")
    private String relatedEventID;
}

这是我试图转换为类的地图:

    {
    stress=0, 

    pain=0, 

    happiness=10, 

    timestamp=1488464269384, 

    is_before=false, 

    lng=-79.6208645, 

    event_name=null, 

    comment=, 

    lat=43.6462939,

    related_event_id=null
}

以及我将 Map 转换为对象的代码:

ObjectMapper m = new ObjectMapper();

MoodDatapoint datapoint = m.convertValue(map, MoodDatapoint.class);

使用logcat计算每次对象转换的持续时间,看来每次转换平均需要62毫秒:

...
D/M DATAPOINT CONVERSION DURATION: 68
D/M DATAPOINT CONVERSION DURATION: 45
D/TOTAL DURATION (S): 3550
D/AVG DURATION: 68
D/Total objects: 

【问题讨论】:

  • 您只是指出这一点还是对此有疑问?
  • 您能发布更多代码吗?看来您正在为每次转换创建一个 ObjectMapper ......这确实很慢。
  • @Okas 这实际上是问题所在!我现在正在使用 ObjectMapper 的单个实例,并且在同一操作中我已经从 3500+ 毫秒变为 52 毫秒。谢谢。

标签: java android json jackson objectmapper


【解决方案1】:

不要为每次转换创建 ObjectMapper,而是创建一个实例并将其用于所有转换。 ObjectMapper 创建是一项非常昂贵的操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2020-08-12
    • 1970-01-01
    • 2015-11-11
    • 2022-01-17
    • 1970-01-01
    • 2013-03-25
    相关资源
    最近更新 更多