Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 648ecb5

Browse files
committed
added serde benchmarks
1 parent d84bbdb commit 648ecb5

File tree

5 files changed

+8317
-0
lines changed

5 files changed

+8317
-0
lines changed

‎pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
<module>test-functional</module>
7777
<module>test-non-functional</module>
7878
<module>test-resilience</module>
79+
<module>test-perf</module>
7980
</modules>
8081
</profile>
8182
</profiles>

‎test-perf/pom.xml

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<modelVersion>4.0.0</modelVersion>
6+
<parent>
7+
<relativePath>../test-parent</relativePath>
8+
<groupId>com.arangodb</groupId>
9+
<artifactId>test-parent</artifactId>
10+
<version>7.14.0</version>
11+
</parent>
12+
13+
<artifactId>test-perf</artifactId>
14+
15+
<properties>
16+
<maven.deploy.skip>true</maven.deploy.skip>
17+
</properties>
18+
19+
<dependencies>
20+
<dependency>
21+
<groupId>org.openjdk.jmh</groupId>
22+
<artifactId>jmh-core</artifactId>
23+
<version>1.37</version>
24+
<scope>test</scope>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.openjdk.jmh</groupId>
28+
<artifactId>jmh-generator-annprocess</artifactId>
29+
<version>1.37</version>
30+
<scope>test</scope>
31+
</dependency>
32+
</dependencies>
33+
34+
</project>
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
package com.arangodb;
2+
3+
import com.arangodb.entity.MultiDocumentEntity;
4+
import com.arangodb.internal.ArangoCollectionImpl;
5+
import com.arangodb.internal.ArangoDatabaseImpl;
6+
import com.arangodb.internal.ArangoExecutor;
7+
import com.arangodb.internal.InternalResponse;
8+
import com.arangodb.internal.serde.InternalSerde;
9+
import com.arangodb.internal.serde.InternalSerdeProvider;
10+
import com.arangodb.jackson.dataformat.velocypack.VPackMapper;
11+
import com.arangodb.util.RawBytes;
12+
import com.arangodb.util.RawJson;
13+
import com.fasterxml.jackson.databind.ObjectMapper;
14+
import com.fasterxml.jackson.databind.JsonNode;
15+
import org.openjdk.jmh.annotations.Benchmark;
16+
import org.openjdk.jmh.annotations.BenchmarkMode;
17+
import org.openjdk.jmh.annotations.Fork;
18+
import org.openjdk.jmh.annotations.Measurement;
19+
import org.openjdk.jmh.annotations.Mode;
20+
import org.openjdk.jmh.annotations.OutputTimeUnit;
21+
import org.openjdk.jmh.annotations.Scope;
22+
import org.openjdk.jmh.annotations.State;
23+
import org.openjdk.jmh.annotations.Warmup;
24+
import org.openjdk.jmh.infra.Blackhole;
25+
import org.openjdk.jmh.profile.GCProfiler;
26+
import org.openjdk.jmh.results.format.ResultFormatType;
27+
import org.openjdk.jmh.runner.Runner;
28+
import org.openjdk.jmh.runner.RunnerException;
29+
import org.openjdk.jmh.runner.options.Options;
30+
import org.openjdk.jmh.runner.options.OptionsBuilder;
31+
32+
import java.io.IOException;
33+
import java.net.URISyntaxException;
34+
import java.nio.file.Files;
35+
import java.nio.file.Path;
36+
import java.nio.file.Paths;
37+
import java.text.SimpleDateFormat;
38+
import java.util.ArrayList;
39+
import java.util.Date;
40+
import java.util.concurrent.TimeUnit;
41+
42+
@Warmup(iterations = 8, time = 1)
43+
@Measurement(iterations = 10, time = 1)
44+
@BenchmarkMode(Mode.AverageTime)
45+
@OutputTimeUnit(TimeUnit.MILLISECONDS)
46+
@Fork(1)
47+
public class SerdeBench {
48+
public static class MyCol extends ArangoCollectionImpl {
49+
static ArangoDB jsonAdb = new ArangoDB.Builder()
50+
.host("127.0.0.1", 8529)
51+
.protocol(Protocol.HTTP_JSON)
52+
.build();
53+
54+
static ArangoDB vpackAdb = new ArangoDB.Builder()
55+
.host("127.0.0.1", 8529)
56+
.protocol(Protocol.HTTP_VPACK)
57+
.build();
58+
59+
private MyCol(ArangoDB adb) {
60+
super((ArangoDatabaseImpl) adb.db(), "foo");
61+
}
62+
63+
public static MyCol ofJson() {
64+
return new MyCol(jsonAdb);
65+
}
66+
67+
public static MyCol ofVpack() {
68+
return new MyCol(vpackAdb);
69+
}
70+
71+
@Override
72+
public <T> ArangoExecutor.ResponseDeserializer<MultiDocumentEntity<T>> getDocumentsResponseDeserializer(Class<T> type) {
73+
return super.getDocumentsResponseDeserializer(type);
74+
}
75+
}
76+
77+
@State(Scope.Benchmark)
78+
public static class Data {
79+
public final byte[] vpack;
80+
public final byte[] json;
81+
public final RawBytes rawJsonBytes;
82+
public final RawBytes rawVPackBytes;
83+
public final RawJson rawJson;
84+
public final MyCol jsonCol = MyCol.ofJson();
85+
public final MyCol vpackCol = MyCol.ofVpack();
86+
public final InternalResponse jsonResp = new InternalResponse();
87+
public final InternalResponse vpackResp = new InternalResponse();
88+
89+
public Data() {
90+
ObjectMapper jsonMapper = new ObjectMapper();
91+
VPackMapper vpackMapper = new VPackMapper();
92+
93+
try {
94+
JsonNode jn = readFile("/api-docs.json", jsonMapper);
95+
json = jsonMapper.writeValueAsBytes(jn);
96+
vpack = vpackMapper.writeValueAsBytes(jn);
97+
rawJsonBytes = RawBytes.of(json);
98+
rawVPackBytes = RawBytes.of(vpack);
99+
rawJson = RawJson.of(jsonMapper.writeValueAsString(jsonMapper.readTree(json)));
100+
101+
JsonNode docs = readFile("/multi-docs.json", jsonMapper);
102+
jsonResp.setResponseCode(200);
103+
jsonResp.setBody(jsonMapper.writeValueAsBytes(docs));
104+
vpackResp.setResponseCode(200);
105+
vpackResp.setBody(vpackMapper.writeValueAsBytes(docs));
106+
} catch (Exception e) {
107+
throw new RuntimeException(e);
108+
}
109+
}
110+
111+
private JsonNode readFile(String filename, ObjectMapper mapper) throws IOException, URISyntaxException {
112+
String str = new String(Files.readAllBytes(
113+
Paths.get(SerdeBench.class.getResource(filename).toURI())));
114+
return mapper.readTree(str);
115+
}
116+
}
117+
118+
public static void main(String[] args) throws RunnerException, IOException {
119+
String datetime = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss").format(new Date());
120+
Path target = Files.createDirectories(Paths.get("target", "jmh-result"));
121+
122+
ArrayList<String> jvmArgs = new ArrayList<>();
123+
jvmArgs.add("-Xms256m");
124+
jvmArgs.add("-Xmx256m");
125+
if (Integer.parseInt(System.getProperty("java.version").split("\\.")[0]) >= 11) {
126+
jvmArgs.add("-XX:StartFlightRecording=filename=" + target.resolve(datetime + ".jfr") + ",settings=profile");
127+
}
128+
129+
Options opt = new OptionsBuilder()
130+
.include(SerdeBench.class.getSimpleName())
131+
.addProfiler(GCProfiler.class)
132+
.jvmArgs(jvmArgs.toArray(new String[0]))
133+
.resultFormat(ResultFormatType.JSON)
134+
.result(target.resolve(datetime + ".json").toString())
135+
.build();
136+
137+
new Runner(opt).run();
138+
}
139+
140+
@Benchmark
141+
public void rawJsonDeser(Data data, Blackhole bh) {
142+
InternalSerde serde = new InternalSerdeProvider(ContentType.VPACK).create();
143+
bh.consume(
144+
serde.deserialize(data.vpack, RawJson.class)
145+
);
146+
}
147+
148+
@Benchmark
149+
public void rawJsonSer(Data data, Blackhole bh) {
150+
InternalSerde serde = new InternalSerdeProvider(ContentType.VPACK).create();
151+
bh.consume(
152+
serde.serialize(data.rawJson)
153+
);
154+
}
155+
156+
@Benchmark
157+
public void extractBytesVPack(Data data, Blackhole bh) {
158+
InternalSerde serde = new InternalSerdeProvider(ContentType.VPACK).create();
159+
bh.consume(
160+
serde.extract(data.vpack, "/definitions/put_api_simple_remove_by_example_opts")
161+
);
162+
}
163+
164+
@Benchmark
165+
public void extractBytesJson(Data data, Blackhole bh) {
166+
InternalSerde serde = new InternalSerdeProvider(ContentType.JSON).create();
167+
bh.consume(
168+
serde.extract(data.json, "/definitions/put_api_simple_remove_by_example_opts")
169+
);
170+
}
171+
172+
@Benchmark
173+
public void deserializeDocsJson(Data data, Blackhole bh) {
174+
bh.consume(
175+
data.jsonCol.getDocumentsResponseDeserializer(RawBytes.class).deserialize(data.jsonResp)
176+
);
177+
}
178+
179+
@Benchmark
180+
public void deserializeDocsVPack(Data data, Blackhole bh) {
181+
bh.consume(
182+
data.vpackCol.getDocumentsResponseDeserializer(RawBytes.class).deserialize(data.vpackResp)
183+
);
184+
}
185+
186+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /