哪个XML序列化库性能更优?

3

如果性能是决定因素,那么Java中最好的XML序列化库是什么?

应用程序要点:

  • 基于Rest的API。
  • Tomcat Servlet容器。
  • 需要Java对象到XML序列化。
  • 不需要反序列化或重型绑定库。
  • 需要开源库。

当前的性能数字:

  • 使用StringBuffer append "<"、">"等生成XML。
    • 平均响应时间=15毫秒。
    • 容易出现格式错误和xml编码错误。
  • 使用XStream序列化生成XML。
    • 平均响应时间=200毫秒。
    • 易于维护和注释。

我发现的其他库,如JiBx、JaxB、Castor或Simple似乎都是绑定框架,而且维护开销很大。

是否有其他高性能的XML序列化替代方案,或者我应该使用XMLStreamWriter API实现toXml(),使用woodstox Stax实现(这似乎是稳定的开源库中最快的)?

2个回答

2

我非常怀疑除非您发送了一个非常大的对象,否则XStream不会花费200毫秒。您确定您的虚拟机已经预热了吗?

我不建议使用StringBuffer,因为它是线程安全的,每次调用都需要锁定。改用StringBuilder。

以下测试打印输出:

Took 56 us on average to serialise a Person

无论你正在序列化什么,它都要花费4000倍的时间。要么你的测试没有预热,要么你在发送大量的数据。如果是后者,我建议以二进制格式发送数据。
// based on the example in the two-minute tutorial.
public class XStreamTest {
    public static class Person {
        private String firstname;
        private String lastname;
        private PhoneNumber phone;
        private PhoneNumber fax;

        public Person(String firstname, String lastname, PhoneNumber phone, PhoneNumber fax) {
            this.firstname = firstname;
            this.lastname = lastname;
            this.phone = phone;
            this.fax = fax;
        }
    }

    public static class PhoneNumber {
        private int code;
        private String number;

        public PhoneNumber(int code, String number) {
            this.code = code;
            this.number = number;
        }
    }

    public static void main(String... args) {
        XStream xstream = new XStream();
        xstream.alias("person", Person.class);
        xstream.alias("phonenumber", PhoneNumber.class);

        Person joe = new Person("Joe", "Walnes", new PhoneNumber(123, "1234-456"), new PhoneNumber(123, "9999-999"));

        final int warmup = 10000;
        final int runs = 20000;

        long start = 0;
        for (int i = -warmup; i < runs; i++) {
            if(i == 0) start = System.nanoTime();
            String xml = xstream.toXML(joe);
        }
        long time = System.nanoTime() - start;
        System.out.printf("Took %,d us on average to serialise a Person%n", time / runs / 1000);
    }
}

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接