使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢
Posted
技术标签:
【中文标题】使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢【英文标题】:Converting Map to Java object using Jackson Object Mapper is very slow 【发布时间】: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 毫秒。谢谢。 【参考方案1】:不要为每次转换创建 ObjectMapper,而是创建一个实例并将其用于所有转换。 ObjectMapper 创建是一项非常昂贵的操作。
【讨论】:
以上是关于使用 Jackson Object Mapper 将 Map 转换为 Java 对象非常慢的主要内容,如果未能解决你的问题,请参考以下文章
来自MongoDB BSON的Jackson ObjectMapper
导入 Jackson-Core-1.x.x 和 Jackson-Mapper-1.x.x 时,我在打包 APK 错误时收到重复文件
使用 Jackson JSON Mapper 在 JSON 到 POJO 之间映射时出现 400 Bad Request