GSON序列化性能很糟糕——1499个对象的序列化时间为161秒



我阅读了大量讨论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注释)。这可能是问题的根源吗?

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

EDIT:还可能值得注意的是,PrblFldr类中的List<PrblFlderAtrbtVal> prblFldrAtrbtVals字段的平均大小可能为5或6,最大为15左右。

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

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

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

最新更新