如何使用高性能解析器在Java中解析JSON?

如何使用高性能解析器在Java中解析JSON?,java,json,Java,Json,我的输入是一个数组,每秒接收大约2000个元素,有时每秒几次。数组的每个元素都有3个大小数 Jackson(com.fasterxml)是亚毫秒级应用程序中速度最慢的部分,平均耗时15毫秒。慢速函数是objectMapper.readValue(text,MyDto.class) 使用基于子字符串的自定义JSON解析算法时,需要几微秒的时间。使用ObjectMapper,它是15毫秒 通过子字符串解析JSON是一种糟糕的做法,因为代码冗长且容易出现错误 您将使用什么进行JSON解析?要求是一个非

我的输入是一个数组,每秒接收大约2000个元素,有时每秒几次。数组的每个元素都有3个大小数

Jackson(com.fasterxml)是亚毫秒级应用程序中速度最慢的部分,平均耗时15毫秒。慢速函数是objectMapper.readValue(text,MyDto.class)

使用基于子字符串的自定义JSON解析算法时,需要几微秒的时间。使用ObjectMapper,它是15毫秒

通过子字符串解析JSON是一种糟糕的做法,因为代码冗长且容易出现错误

您将使用什么进行JSON解析?要求是一个非常快速的算法

我找到了DSL json,但不知道如何将带有json的字符串解析到我的DTO中。我还没有找到将JSON从字符串解析为DTO的简单快速算法

编辑:要分析的输入位于:

https://pastebin.com/831YtBdq
代码:

杰克罗菲勒(杰克逊):

编辑2:

JProfiler(Gson):

从JProfiler可以看出,格森的速度是杰克逊的几倍。还有什么比Gson更快

  • 不要使用字符串作为输入,而是立即解析从线路或磁盘读取的缓冲字节
  • 如果需要以相同的精度将其值序列化回JSON,请不要绑定到BigDecimal,而是根据您的规则使用double primitive+高效格式化程序
  • 对价格/金额对的内部数组使用2字段类
  • 切换到Scala并使用(DECLAIMER:我是这个惊人库的贡献者)
  • 完成所有这些步骤后,在一个线程中解析示例时,您将获得超过每秒400Mb的速度


    查看解析的
    GeoJSONReading
    的结果。

    也许值得展示一下您用于Jackson基准测试的代码,与简单的手动解析相比,micros和millis的性能改进听起来很奇怪。@AllenHacks尝试创建一个阅读器
    objectMapper.reader(MyDto.class)事先。@khachik我试图将读卡器创建为私有属性。它在运行时不会减少任何毫秒。分析器显示ObjectMapper.readValue()归结起来就是com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize,其中是NumberDeserializers$BigDecimalDeserializer.deserialize,这是jackson最慢的部分。@AllenHacks放弃java.math.BigDecimal是保存安全性和性能的最好方法。您是否尝试过运行
    (new java.math.BigDecimal(“1000000000e1000000000”)).add(new java.math.BigDecimal(1))?试试看,如果有人通过JSON.1向您发送这样的值,会发生什么。我使用OkHttp、Pusher和SignalR作为3个web套接字适配器。Okhttp和Pusher给我发绳子。他们不让我抓取缓冲流。你会怎么做。Double和Float不能精确表示浮点数。我必须使用大小数3。我已经尝试并评估了列表与数组。这对性能没有任何影响。阵列理论上应该更快。我尝试过Jsoniter(java),与供应商的合成基准测试不同,使用上述JSON和POJO的真实基准测试无法使Jsoniter表现得如此出色。它几乎和杰克逊一样慢。我希望jsoniter能够击败Gson,但不行,当使用JProfiler进行测试时,jsoniter的速度要慢好几倍。我已经执行了两次测试来确认,并得出了大致相同的数字。我无法相信jsoniter和gson相比有多慢。我只尝试了Gson兼容模式的API。1。改用高效的HTTP客户端,它可以通过数组或输入流提供对字节的访问。2.在使用无限数学上下文之前,不能使用BigDecimal精确表示任何浮点数。但是使用它是一个巨大的安全漏洞。3.若你们不能发现数组或列表性能上的差异,那个么就修改你们的基准测试工具或它们的用法。4.Jsoniter scala不依赖于Jsoniter(Java)——它最终从头开始实现整个解析和序列化。所以,如果您真的在寻找高性能的JSON解析器,您肯定需要尝试一下。
    
    public class BitstampOrderBook {
        private long timestamp;
        private List<List<BigDecimal>> bids;
        private List<List<BigDecimal>> asks;
    
        public BitstampOrderBook() {
    
        }
    
        public BitstampOrderBook(long timestamp, List<List<BigDecimal>> bids, List<List<BigDecimal>> asks) {
            this.timestamp = timestamp;
            this.bids = bids;
            this.asks = asks;
        }
    
        public long getTimestamp() {
            return timestamp;
        }
    
        public List<List<BigDecimal>> getBids() {
            return bids;
        }
    
        public List<List<BigDecimal>> getAsks() {
            return asks;
        }
    }
    
    public class BitstampOrder {
        private BigDecimal price;
    
        private BigDecimal amount;
    
        private String datetime;
    
        private int id;
    
        @SerializedName("order_type")
        private int orderType;
    
        public BigDecimal getPrice() {
            return price;
        }
    
        public void setPrice(BigDecimal price) {
            this.price = price;
        }
    
        public BigDecimal getAmount() {
            return amount;
        }
    
        public void setAmount(BigDecimal amount) {
            this.amount = amount;
        }
    
        public String getDatetime() {
            return datetime;
        }
    
        public void setDatetime(String datetime) {
            this.datetime = datetime;
        }
    
        public int getId() {
            return id;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getOrderType() {
            return orderType;
        }
    
        public void setOrderType(int orderType) {
            this.orderType = orderType;
        }
    
        @Override
        public String toString() {
            return "BitStampOrder{" +
                    "price=" + price +
                    ", amount=" + amount +
                    ", datetime='" + datetime + '\'' +
                    ", id='" + id + '\'' +
                    ", orderType='" + orderType + '\'' +
                    '}';
        }
    }
    
    BitstampOrderBook orderBook = objectMapper.readValue(jsonString, BitstampOrderBook.class);
    
    https://i.imgur.com/mjdbDQe.png
    
    https://i.imgur.com/WcHVhhd.png