为什么杰克逊这么慢?

时间:2014-03-24 09:24:38

标签: java json networking jackson jsoup

我使用简单的Jackson代码将我的对象转换为json String, 但它确实很慢。如下所示,仅转换一个对象需要70毫秒 在我的机器上。我做了什么吗?

ObjectMapper myObjectMapper = new ObjectMapper();
void testJson()
{

    MyClass state = new MyClass();
    try
    {
        String result = myObjectMapper.writeValueAsString(state);
    } catch (Exception ex)
    {

    }

}

只有4名成员的MyClass

 MyClass
    {
    public int a;
        public  int b;
        public int c;
        public String d;
    }

1 个答案:

答案 0 :(得分:5)

  

我使用简单的Jackson代码将我的对象转换为json String,但它确实很慢。在我的机器中只转换一个对象需要70毫秒。我做了什么吗?

编码和发送JSON消息70毫秒是不可信的。毫无疑问,我真正的解释是,70毫秒的测量结果是您对代码进行基准测试的方法。可能,你没有允许JVM预热效果。

所以,是的,你做错了你的基准测试。可能。

  

现在我发现了三种通过网络发送MyClass实例的解决方案:1:使用Jackson转换为byte []并发送。 2:使用内置序列化转换为byte []并发送。 3:将MyClass的成员转换为String,然后转换为byte []并发送。还有其他更好的解决方案吗?

理论上(即如果你有足够的技巧,时间和耐心),可以通过手动将数据编码到字节缓冲区并发送它来实现最佳性能。但那只是理论上的。

如果您正在寻找可能比您尝试过的替代品更快的实用解决方案,请查看Google Protocol Buffers。他们被认为是快...


  

一个对象70毫秒,但是当我尝试1000个对象时,它只需要114毫秒,不奇怪吗?

实际上,当你考虑JVM的工作方式时,并不奇怪。

当JVM启动时,它会加载您的代码并使用字节码解释器开始运行它。在对代码进行了一些解释之后,JVM运行JIT编译器,为经常调用的方法生成优化的本机代码。这个编译过程需要很长时间。

因此,当您测量发送一个对象所花费的时间时,您可能真的测量发送一个对象的时间并进行一堆JIT编译。但JIT编译工作不需要重复。净结果 - 处理一个对象出现需要花费相当长的时间,而不是1000。

JIT编译是常见的JVM预热效果之一,可能会扭曲编写糟糕的Java基准测试。