java - 哪个xml序列化库是性能导向的?

标签 java xml performance serialization

<分区>

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

应用要点

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

当前性能数据

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

我遇到的其他库(例如 JiBx、JaxB、Castor 或 Simple)似乎是绑定(bind)框架,并且维护开销似乎很大。

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

最佳答案

我严重怀疑 XStream 是否需要 200 毫秒,除非您发送一个非常大的对象。您确定您的 VM 已预热吗?

我不会将 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);
    }
}

关于java - 哪个xml序列化库是性能导向的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5918665/

相关文章:

java - 测试 FileOutputStream 与 BufferedOutputStream 上的 write(byte[])

java - 为每个传入请求重置 servlet 类的实例变量

android - 修复 styles.xml 中的错误以生成 R.java : No resource found name 'Theme.AppCompat.Light'

ruby-on-rails - 检索数据库数据的 finder 方法的性能

xml - 将带有 namespace 的 xml 文件中的值插入到 csv 文件中

android,如何将一个 XML 文件包含到另一个 XML 文件中?

c# - 为什么这个总计操作在栈上比在堆上更快?

java - 无法在java程序中运行.bat文件

java - 在 hibernate 中的一个公共(public)位置进行逻辑删除

java - 为 Java 创建编译脚本