java - 为什么 jackson 这么慢?

标签 java json networking jackson jsoup

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

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

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

    }

}

MyClass 只有 4 个成员

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

最佳答案

I use simple Jackson code to convert from my object to json String, but it really slow. It takes 70 milisecond to convert only one object as below in my machine. Did I do something wong?

70 毫秒来编码和发送 JSON 消息是不可信的。毫无疑问,真正的解释是 70 毫秒的测量是您对代码进行基准测试的方式的产物。可能是您没有考虑到 JVM 预热效果。

所以,是的,您的基准测试不正确。大概吧。

Now I found out three solutions for sending MyClass's instance over network: 1: use Jackson to convert into byte[] and send. 2: use built-in serialization to convert into byte[] and send. 3: convert MyClass's members into String, then into byte[] and send. Is there any other better solution ?

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

如果您正在寻找可能比您尝试过的替代方案更快的实用解决方案,请查看 Google Protocol Buffers .他们以速度快而著称...


70 milliseconds for one object, but when I try 1000 objects, it only takes 114 milliseconds, isn't it strange?

实际上,考虑到 JVM 的工作方式,这一点也不奇怪。

当 JVM 启动时,它会加载您的代码并开始使用字节码解释器运行它。在代码被解释一下之后,JVM 运行 JIT 编译器为经常调用的方法生成优化的 native 代码。此编译过程需要大量时间。

因此,当您测量发送一个对象所花费的时间时,您可能真的测量发送一个对象的时间并进行一堆 JIT 编译。但是 JIT 编译工作不需要重复。最终结果 - 与 1000 个相比,处理一个 似乎 的对象需要花费惊人的时间。

JIT 编译是常见的 JVM 预热效果之一,它会扭曲编写不佳的 Java 基准测试。

关于java - 为什么 jackson 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22605354/

相关文章:

java - 在 Spring Data 中是否可以使用实体的唯一属性删除实体?

java - 如何摆脱 `com.pentaho.commons.dsc.f: license missing, invalid, or expired?`

java - 为具有自己的 JSON 序列化实现的类编写 Gson TypeAdapter

javascript - node.js:创建通过数据驱动事件自动更新客户端的应用程序

java - 在 Linux 上创建 Minecraft 服务器

java - 对于参数类型,运算符 > 未定义 Integer, int

python - 如何在python3中json.dumps字节对象

java 。从包中获取 URL

node.js - Node JS TCP 代理 : Set up HTTP Tunnel using Node JS

networking - virtualbox 客户端机器 : host name lookup failure in telnet while the same hostname lookup success in ping