forked from simdjson/simdjson-java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathParseAndSelectBenchmark.java
104 lines (93 loc) · 3.84 KB
/
ParseAndSelectBenchmark.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package org.simdjson;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Level;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import static org.simdjson.SimdJsonPaddingUtil.padded;
@State(Scope.Benchmark)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.SECONDS)
public class ParseAndSelectBenchmark {
private final SimdJsonParser simdJsonParser = new SimdJsonParser();
private final ObjectMapper objectMapper = new ObjectMapper();
private byte[] buffer;
private byte[] bufferPadded;
@Setup(Level.Trial)
public void setup() throws IOException {
try (InputStream is = ParseBenchmark.class.getResourceAsStream("/twitter.json")) {
buffer = is.readAllBytes();
bufferPadded = padded(buffer);
}
System.out.println("VectorSpecies = " + VectorUtils.BYTE_SPECIES);
}
@Benchmark
public int countUniqueUsersWithDefaultProfile_jackson() throws IOException {
JsonNode jacksonJsonNode = objectMapper.readTree(buffer);
Set<String> defaultUsers = new HashSet<>();
Iterator<JsonNode> tweets = jacksonJsonNode.get("statuses").elements();
while (tweets.hasNext()) {
JsonNode tweet = tweets.next();
JsonNode user = tweet.get("user");
if (user.get("default_profile").asBoolean()) {
defaultUsers.add(user.get("screen_name").textValue());
}
}
return defaultUsers.size();
}
@Benchmark
public int countUniqueUsersWithDefaultProfile_fastjson() {
JSONObject jsonObject = (JSONObject) JSON.parse(buffer);
Set<String> defaultUsers = new HashSet<>();
Iterator<Object> tweets = jsonObject.getJSONArray("statuses").iterator();
while (tweets.hasNext()) {
JSONObject tweet = (JSONObject) tweets.next();
JSONObject user = (JSONObject) tweet.get("user");
if (user.getBoolean("default_profile")) {
defaultUsers.add(user.getString("screen_name"));
}
}
return defaultUsers.size();
}
@Benchmark
public int countUniqueUsersWithDefaultProfile_simdjson() {
JsonValue simdJsonValue = simdJsonParser.parse(buffer, buffer.length);
Set<String> defaultUsers = new HashSet<>();
Iterator<JsonValue> tweets = simdJsonValue.get("statuses").arrayIterator();
while (tweets.hasNext()) {
JsonValue tweet = tweets.next();
JsonValue user = tweet.get("user");
if (user.get("default_profile").asBoolean()) {
defaultUsers.add(user.get("screen_name").asString());
}
}
return defaultUsers.size();
}
@Benchmark
public int countUniqueUsersWithDefaultProfile_simdjsonPadded() {
JsonValue simdJsonValue = simdJsonParser.parse(bufferPadded, buffer.length);
Set<String> defaultUsers = new HashSet<>();
Iterator<JsonValue> tweets = simdJsonValue.get("statuses").arrayIterator();
while (tweets.hasNext()) {
JsonValue tweet = tweets.next();
JsonValue user = tweet.get("user");
if (user.get("default_profile").asBoolean()) {
defaultUsers.add(user.get("screen_name").asString());
}
}
return defaultUsers.size();
}
}