【问题标题】:GSON Serialization Performance is Terrible - 161 seconds for 1499 objectsGSON 序列化性能非常糟糕 - 1499 个对象需要 161 秒
【发布时间】:2014-03-26 13:50:07
【问题描述】:

我已经阅读了大量讨论 GSON 性能的主题,如果您担心性能,许多人建议使用流式传输。不过,似乎没有人遇到像我这样的性能问题。

这是我初始化 GSON 对象的方式:

gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

这是我正在执行的.toJson() 语句,它是我即将展示的基准测试结果中的唯一语句:

String resultString = gson.toJson(results.get(0));

... 其中results.get(0) 计算为包含1499 个PrblFldr 对象的List<PrblFldr> 对象(我将展示稍后序列化的非原始类)。以下是我临时基准测试的结果:

INFO: Starting: GSON CONVERSION
INFO: Finished: GSON CONVERSION  ---  Time: 161705 ms

最后,这是我要序列化的类。我只显示带有@Expose 注释的那些,因为这些是唯一应该序列化的字段。

PrblFldr:

public class PrblFldr implements Serializable {

    @Expose
    @SerializedName("name")
    @Column(name="FLDR_NM")
    private String fldrNm;

    @Expose
    @SerializedName("template")
    @ManyToOne
    @JoinColumn(name="FLDR_TYP_SEQ_ID", insertable=false, updatable=false)
    private PrblTmplt prblTmplt;

    @Expose
    @SerializedName("attributes")
    @OneToMany(mappedBy="prblFldr")
    private List<PrblFldrAtrbtVal> prblFldrAtrbtVals;

    // other fields omitted...
}

PrblTmplt:

public class PrblTmplt implements Serializable {

    @Expose
    @SerializedName("id")
    @Id
    @Column(name="TMPLT_SEQ_ID")
    private long tmpltSeqId;

    @Expose
    @SerializedName("name")
    @Column(name="TMPLT_NM")
    private String tmpltNm;

    // other fields omitted...
}

PrblFldrAtrbtVal:

public class PrblFldrAtrbtVal implements Serializable {

    @Expose
    @SerializedName("id")
    @Id
    @Column(name="FLDR_ATRBT_VAL_SEQ_ID")
    private long fldrAtrbtValSeqId;

    @Expose
    @SerializedName("val")
    @Column(name="FLDR_ATRBT_VAL")
    private String fldrAtrbtVal;

    @Expose
    @SerializedName("attributeTemplate")
    @ManyToOne
    @JoinColumn(name="FLDR_ATRBT_SEQ_ID")
    private PrblTmpltAtrbt prblTmpltAtrbt;

    // other fields omitted...
}

最后,PrblTmpltAtrbt:

public class PrblTmpltAtrbt implements Serializable {

    @Expose
    @SerializedName("id")
    @Id
    @Column(name="TMPLT_ATRBT_SEQ_ID")
    private long tmpltAtrbtSeqId;

    @Expose
    @SerializedName("name")
    @Column(name="TMPLT_ATRBT_LBL_NM")
    private String tmpltAtrbtLblNm;

    @Expose
    @SerializedName("required")
    @Column(name="TMPLT_ATRBT_RQRD_IND")
    private String tmpltAtrbtRqrdInd;

    // other fields omitted...
}

如您所见,一切都分解为 longString 对象。尽管这里进行了 4 层对象序列化,但我仍然认为我不应该看到如此长的序列化时间。此外,您可能已经注意到,我使用的是 EclipseLink JPA(因此有 @Id@Column 注释)。这可能是问题的根源吗?

问题:是什么导致了如此长的序列化时间?

编辑:还可能值得注意的是,PrblFldr 类中的 List&lt;PrblFlderAtrbtVal&gt; prblFldrAtrbtVals 字段的平均大小可能为 5 或 6,最大为 15 左右。 p>

【问题讨论】:

  • 您不太可能正确/准确地测量它,但是是的; Gson并不是特别快。如果你想快速使用杰克逊。 github.com/eishay/jvm-serializers/wiki
  • 但考虑到 this topic 谈到 GSON 需要 3-5 秒处理 7000 个 POJO,我很困惑为什么这需要很长时间。
  • Gson 的哪个版本?
  • 我使用的是 GSON 2.2.4。

标签: json jpa serialization eclipselink gson


【解决方案1】:

我得出的结论是,这个问题是由于我在本地运行的服务器而不是专用的远程服务器上运行它造成的。我假设我的笔记本电脑正在限制性能,这会扭曲结果。

我通过越来越少地依赖 GSON 的内置序列化功能来确定这一点。我什至甚至只使用 StringBuilder 从头开始​​编写我自己的序列化程序。不幸的是,我只将过程加快了大约 5 秒,性能提升了 3%。

当我将它放在远程服务器上时,我确信我会看到实际的性能指标。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2015-05-11
    • 2015-11-23
    • 2012-05-28
    • 2012-05-06
    • 2012-02-21
    • 2016-06-29
    相关资源
    最近更新 更多