| 
 | 1 | +/*  | 
 | 2 | + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one  | 
 | 3 | + * or more contributor license agreements. Licensed under the "Elastic License  | 
 | 4 | + * 2.0", the "GNU Affero General Public License v3.0 only", and the "Server Side  | 
 | 5 | + * Public License v 1"; you may not use this file except in compliance with, at  | 
 | 6 | + * your election, the "Elastic License 2.0", the "GNU Affero General Public  | 
 | 7 | + * License v3.0 only", or the "Server Side Public License, v 1".  | 
 | 8 | + */  | 
 | 9 | + | 
 | 10 | +package org.elasticsearch.benchmark.xcontent;  | 
 | 11 | + | 
 | 12 | +import org.elasticsearch.common.bytes.BytesReference;  | 
 | 13 | +import org.elasticsearch.common.io.Streams;  | 
 | 14 | +import org.elasticsearch.xcontent.XContentParser;  | 
 | 15 | +import org.elasticsearch.xcontent.XContentParserConfiguration;  | 
 | 16 | +import org.elasticsearch.xcontent.XContentType;  | 
 | 17 | +import org.openjdk.jmh.annotations.Benchmark;  | 
 | 18 | +import org.openjdk.jmh.annotations.BenchmarkMode;  | 
 | 19 | +import org.openjdk.jmh.annotations.Fork;  | 
 | 20 | +import org.openjdk.jmh.annotations.Level;  | 
 | 21 | +import org.openjdk.jmh.annotations.Measurement;  | 
 | 22 | +import org.openjdk.jmh.annotations.Mode;  | 
 | 23 | +import org.openjdk.jmh.annotations.OutputTimeUnit;  | 
 | 24 | +import org.openjdk.jmh.annotations.Scope;  | 
 | 25 | +import org.openjdk.jmh.annotations.Setup;  | 
 | 26 | +import org.openjdk.jmh.annotations.State;  | 
 | 27 | +import org.openjdk.jmh.annotations.Warmup;  | 
 | 28 | +import org.openjdk.jmh.infra.Blackhole;  | 
 | 29 | + | 
 | 30 | +import java.io.IOException;  | 
 | 31 | +import java.util.Arrays;  | 
 | 32 | +import java.util.Collections;  | 
 | 33 | +import java.util.List;  | 
 | 34 | +import java.util.Map;  | 
 | 35 | +import java.util.Random;  | 
 | 36 | +import java.util.concurrent.TimeUnit;  | 
 | 37 | +import java.util.stream.Collectors;  | 
 | 38 | + | 
 | 39 | +@Fork(1)  | 
 | 40 | +@Warmup(iterations = 5)  | 
 | 41 | +@Measurement(iterations = 10)  | 
 | 42 | +@BenchmarkMode(Mode.AverageTime)  | 
 | 43 | +@OutputTimeUnit(TimeUnit.NANOSECONDS)  | 
 | 44 | +@State(Scope.Thread)  | 
 | 45 | +public class JsonParserBenchmark {  | 
 | 46 | +    private Map<String, BytesReference> sourceBytes;  | 
 | 47 | +    private BytesReference source;  | 
 | 48 | +    private Random random;  | 
 | 49 | +    private List<String> sourcesRandomized;  | 
 | 50 | + | 
 | 51 | +    final String[] sources = new String[] { "monitor_cluster_stats.json", "monitor_index_stats.json", "monitor_node_stats.json" };  | 
 | 52 | + | 
 | 53 | +    @Setup(Level.Iteration)  | 
 | 54 | +    public void randomizeSource() {  | 
 | 55 | +        sourcesRandomized = Arrays.asList(sources);  | 
 | 56 | +        Collections.shuffle(sourcesRandomized, random);  | 
 | 57 | +    }  | 
 | 58 | + | 
 | 59 | +    @Setup(Level.Trial)  | 
 | 60 | +    public void setup() throws IOException {  | 
 | 61 | +        random = new Random();  | 
 | 62 | +        sourceBytes = Arrays.stream(sources).collect(Collectors.toMap(s -> s, s -> {  | 
 | 63 | +            try {  | 
 | 64 | +                return readSource(s);  | 
 | 65 | +            } catch (IOException e) {  | 
 | 66 | +                throw new RuntimeException(e);  | 
 | 67 | +            }  | 
 | 68 | +        }));  | 
 | 69 | +    }  | 
 | 70 | + | 
 | 71 | +    @Benchmark  | 
 | 72 | +    public void parseJson(Blackhole bh) throws IOException {  | 
 | 73 | +        sourcesRandomized.forEach(source -> {  | 
 | 74 | +            try {  | 
 | 75 | +                final XContentParser parser = XContentType.JSON.xContent()  | 
 | 76 | +                    .createParser(XContentParserConfiguration.EMPTY, sourceBytes.get(source).streamInput());  | 
 | 77 | +                bh.consume(parser.mapOrdered());  | 
 | 78 | +            } catch (IOException e) {  | 
 | 79 | +                throw new RuntimeException(e);  | 
 | 80 | +            }  | 
 | 81 | +        });  | 
 | 82 | +    }  | 
 | 83 | + | 
 | 84 | +    private BytesReference readSource(String fileName) throws IOException {  | 
 | 85 | +        return Streams.readFully(JsonParserBenchmark.class.getResourceAsStream(fileName));  | 
 | 86 | +    }  | 
 | 87 | +}  | 
0 commit comments