Skip to content

Commit dcc42c8

Browse files
darxriggsfabienrenaud
authored andcommitted
Add benchmarking for Jackson Blackbird
Blackbird will eventually replace Afterburner. see https://github.com/FasterXML/jackson-modules-base/tree/2.13/blackbird NOTE: When running this on Java <9, the following warning is logged (incl. a stacktrace). > com.fasterxml.jackson.module.blackbird.util.ReflectionHack$Java9Up init > WARNING: Unable to find Java 9+ MethodHandles.privateLookupIn. Blackbird is not performing optimally! > java.lang.NoSuchMethodException: no such method: java.lang.invoke.MethodHandles.privateLookupIn(Class,Lookup)Lookup/invokeStatic
1 parent 3e0ae83 commit dcc42c8

File tree

10 files changed

+51
-3
lines changed

10 files changed

+51
-3
lines changed

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ dependencies {
3434
// Jackson
3535
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: "${jacksonVersion}"
3636
implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-afterburner', version: "${jacksonVersion}"
37+
implementation group: 'com.fasterxml.jackson.module', name: 'jackson-module-blackbird', version: "${jacksonVersion}"
3738
implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: "${jacksonVersion}"
3839
// GSON
3940
implementation group: 'com.google.code.gson', name: 'gson', version: '2.8.9'

src/main/java/com/github/fabienrenaud/jjb/JsonBench.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ public Object jackson_afterburner() throws Exception {
2323
return null;
2424
}
2525

26+
public Object jackson_blackbird() throws Exception {
27+
return null;
28+
}
29+
2630
public Object orgjson() throws Exception {
2731
return null;
2832
}

src/main/java/com/github/fabienrenaud/jjb/databind/Deserialization.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ public Object jackson_afterburner() throws IOException {
3737
return JSON_SOURCE().provider().jacksonAfterburner().readValue(JSON_SOURCE().nextByteArray(), JSON_SOURCE().pojoType());
3838
}
3939

40+
@Benchmark
41+
@Override
42+
public Object jackson_blackbird() throws IOException {
43+
return JSON_SOURCE().provider().jacksonBlackbird().readValue(JSON_SOURCE().nextByteArray(), JSON_SOURCE().pojoType());
44+
}
45+
4046
@Benchmark
4147
@Override
4248
public Object genson() throws JsonSyntaxException {

src/main/java/com/github/fabienrenaud/jjb/databind/Serialization.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ public Object jackson_afterburner() throws Exception {
4242
return baos;
4343
}
4444

45+
@Benchmark
46+
@Override
47+
public Object jackson_blackbird() throws Exception {
48+
ByteArrayOutputStream baos = JsonUtils.byteArrayOutputStream();
49+
JSON_SOURCE().provider().jacksonBlackbird().writeValue(baos, JSON_SOURCE().nextPojo());
50+
return baos;
51+
}
52+
4553
@Benchmark
4654
@Override
4755
public Object genson() {

src/main/java/com/github/fabienrenaud/jjb/provider/ClientsJsonProvider.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.fasterxml.jackson.databind.SerializationFeature;
1010
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
1111
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
12+
import com.fasterxml.jackson.module.blackbird.BlackbirdModule;
1213
import com.github.fabienrenaud.jjb.model.Clients;
1314
import com.google.gson.Gson;
1415
import com.google.gson.GsonBuilder;
@@ -59,6 +60,10 @@ public class ClientsJsonProvider implements JsonProvider<Clients> {
5960
.registerModule(new AfterburnerModule())
6061
.registerModule(new JavaTimeModule())
6162
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
63+
private final ObjectMapper jacksonBlackbird = new ObjectMapper()
64+
.registerModule(new BlackbirdModule())
65+
.registerModule(new JavaTimeModule())
66+
.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
6267
private final javax.json.stream.JsonGeneratorFactory javaxJsonFactory = javax.json.Json.createGeneratorFactory(null);
6368
private final JsonFactory jacksonFactory = new JsonFactory();
6469
private final Genson genson = new GensonBuilder()
@@ -189,6 +194,11 @@ public ObjectMapper jacksonAfterburner() {
189194
return jacksonAfterburner;
190195
}
191196

197+
@Override
198+
public ObjectMapper jacksonBlackbird() {
199+
return jacksonBlackbird;
200+
}
201+
192202
@Override
193203
public JsonFactory jacksonFactory() {
194204
return jacksonFactory;

src/main/java/com/github/fabienrenaud/jjb/provider/JsonProvider.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ public interface JsonProvider<T> {
2121

2222
ObjectMapper jacksonAfterburner();
2323

24+
ObjectMapper jacksonBlackbird();
25+
2426
JsonFactory jacksonFactory();
2527

2628
javax.json.stream.JsonGeneratorFactory javaxjsonFactory();

src/main/java/com/github/fabienrenaud/jjb/provider/UsersJsonProvider.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.fasterxml.jackson.core.JsonFactory;
88
import com.fasterxml.jackson.databind.ObjectMapper;
99
import com.fasterxml.jackson.module.afterburner.AfterburnerModule;
10+
import com.fasterxml.jackson.module.blackbird.BlackbirdModule;
1011
import com.github.fabienrenaud.jjb.model.Users;
1112
import com.google.gson.Gson;
1213
import com.owlike.genson.Genson;
@@ -31,7 +32,10 @@ public class UsersJsonProvider implements JsonProvider<Users> {
3132
private final Gson gson = new Gson();
3233
private final javax.json.stream.JsonGeneratorFactory javaxJsonFactory = javax.json.Json.createGeneratorFactory(null);
3334
private final ObjectMapper jackson = new ObjectMapper();
34-
private final ObjectMapper jacksonAfterburner = new ObjectMapper();
35+
private final ObjectMapper jacksonAfterburner = new ObjectMapper()
36+
.registerModule(new AfterburnerModule());
37+
private final ObjectMapper jacksonBlackbird = new ObjectMapper()
38+
.registerModule(new BlackbirdModule());
3539
private final JsonFactory jacksonFactory = new JsonFactory();
3640
private final Genson genson = new Genson();
3741
private final Jsonb yasson = new JsonBindingProvider().create()
@@ -54,8 +58,6 @@ public class UsersJsonProvider implements JsonProvider<Users> {
5458
private final JsonType<Users> avajeJsonb_default = io.avaje.jsonb.Jsonb.newBuilder().adapter(new JsonStream(/* serializeNulls */ true, /* serializeEmpty */ true, /* failOnUnknown */ false)).build().type(Users.class);
5559

5660
public UsersJsonProvider() {
57-
jacksonAfterburner.registerModule(new AfterburnerModule());
58-
5961
jsonioStreamOptions.put(JsonReader.USE_MAPS, true);
6062
jsonioStreamOptions.put(JsonWriter.TYPE, false);
6163

@@ -83,6 +85,11 @@ public ObjectMapper jacksonAfterburner() {
8385
return jacksonAfterburner;
8486
}
8587

88+
@Override
89+
public ObjectMapper jacksonBlackbird() {
90+
return jacksonBlackbird;
91+
}
92+
8693
@Override
8794
public JsonFactory jacksonFactory() {
8895
return jacksonFactory;

src/main/java/com/github/fabienrenaud/jjb/support/BenchSupport.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public enum BenchSupport {
1010
new Libapi(Library.GSON, Api.DATABIND, Api.STREAM),
1111
new Libapi(Library.JACKSON, Api.DATABIND, Api.STREAM),
1212
new Libapi(Library.JACKSON_AFTERBURNER, Api.DATABIND),
13+
new Libapi(Library.JACKSON_BLACKBIRD, Api.DATABIND),
1314
new Libapi(Library.ORGJSON, Api.STREAM),
1415
new Libapi(Library.GENSON, Api.DATABIND, Api.STREAM),
1516
new Libapi(Library.YASSON, Api.DATABIND),
@@ -40,6 +41,7 @@ public enum BenchSupport {
4041
new Libapi(Library.GSON, Api.DATABIND),
4142
new Libapi(Library.JACKSON, Api.DATABIND),
4243
new Libapi(Library.JACKSON_AFTERBURNER, Api.DATABIND),
44+
new Libapi(Library.JACKSON_BLACKBIRD, Api.DATABIND),
4345
new Libapi(Library.ORGJSON),
4446
new Libapi(Library.GENSON, Api.DATABIND),
4547
new Libapi(false, Library.YASSON, Api.DATABIND),

src/main/java/com/github/fabienrenaud/jjb/support/Library.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public enum Library {
88
GSON,
99
JACKSON,
1010
JACKSON_AFTERBURNER,
11+
JACKSON_BLACKBIRD,
1112
ORGJSON,
1213
YASSON,
1314
GENSON, JAVAXJSON,

src/test/java/com/github/fabienrenaud/jjb/JsonBenchmark.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,13 @@ public void jackson_afterburner() throws Exception {
8383
}
8484
}
8585

86+
@Test
87+
public void jackson_blackbird() throws Exception {
88+
for (int i = 0; i < ITERATIONS; i++) {
89+
test(Library.JACKSON_BLACKBIRD, BENCH.jackson_blackbird());
90+
}
91+
}
92+
8693
@Test
8794
public void orgjson() throws Exception {
8895
for (int i = 0; i < ITERATIONS; i++) {

0 commit comments

Comments
 (0)