package com.jsoniter;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.type.TypeReference;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.SerializedName;
import com.jsoniter.extra.GsonCompatibilityMode;
import com.jsoniter.spi.DecodingMode;
import com.jsoniter.spi.JsoniterSpi;
import org.openjdk.jmh.Main;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.BenchmarkParams;
import org.openjdk.jmh.infra.Blackhole;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Date;
import java.util.List;
@State(Scope.Thread)
public class BenchGson {
private GsonCompatibilityMode gsonCompatibilityMode;
private Gson gson;
@Setup(Level.Trial)
public void benchSetup(BenchmarkParams params) {
gson = new GsonBuilder()
.setDateFormat("EEE MMM dd HH:mm:ss Z yyyy")
.create();
gsonCompatibilityMode = new GsonCompatibilityMode.Builder().setDateFormat("EEE MMM dd HH:mm:ss Z yyyy").build();
JsoniterSpi.setCurrentConfig(gsonCompatibilityMode);
JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH);
if (params != null) {
if (params.getBenchmark().contains("jsoniterDynamicCodegenDecoder")) {
JsonIterator.setMode(DecodingMode.DYNAMIC_MODE_AND_MATCH_FIELD_WITH_HASH);
}
}
}
@Benchmark
public void gsonDecoder(Blackhole bh) throws IOException {
FileInputStream stream = new FileInputStream("./src/test/tweets.json");
InputStreamReader reader = new InputStreamReader(stream);
try {
bh.consume(gson.fromJson(reader, new TypeReference>() {
}.getType()));
} finally {
reader.close();
stream.close();
}
}
@Benchmark
public void jsoniterReflectionDecoder(Blackhole bh) throws IOException {
FileInputStream stream = new FileInputStream("./src/test/tweets.json");
JsonIterator iter = JsonIteratorPool.borrowJsonIterator();
try {
iter.reset(stream);
bh.consume(iter.read(new TypeReference
>() {
}.getType()));
} finally {
JsonIteratorPool.returnJsonIterator(iter);
stream.close();
}
}
//
// @Benchmark
// public void jsoniterDynamicCodegenDecoder(Blackhole bh) throws IOException {
// bh.consume(JsonIterator.deserialize(gsonCompatibilityMode, json, BagOfPrimitives.class));
// }
public static void main(String[] args) throws Exception {
Main.main(new String[]{
"BenchGson",
"-i", "5",
"-wi", "5",
"-f", "1",
});
}
public static class Tweet {
@JsonProperty
String coordinates;
@JsonProperty
boolean favorited;
@JsonProperty
Date created_at;
@JsonProperty
boolean truncated;
@JsonProperty
Tweet retweeted_status;
@JsonProperty
String id_str;
@JsonProperty
String in_reply_to_id_str;
@JsonProperty
String contributors;
@JsonProperty
String text;
@JsonProperty
long id;
@JsonProperty
String retweet_count;
@JsonProperty
String in_reply_to_status_id_str;
@JsonProperty
Object geo;
@JsonProperty
boolean retweeted;
@JsonProperty
String in_reply_to_user_id;
@JsonProperty
String in_reply_to_screen_name;
@JsonProperty
Object place;
@JsonProperty
User user;
@JsonProperty
String source;
@JsonProperty
String in_reply_to_user_id_str;
}
static class User {
@JsonProperty
String name;
@JsonProperty
String profile_sidebar_border_color;
@JsonProperty
boolean profile_background_tile;
@JsonProperty
String profile_sidebar_fill_color;
@JsonProperty
Date created_at;
@JsonProperty
String location;
@JsonProperty
String profile_image_url;
@JsonProperty
boolean follow_request_sent;
@JsonProperty
String profile_link_color;
@JsonProperty
boolean is_translator;
@JsonProperty
String id_str;
@JsonProperty
int favourites_count;
@JsonProperty
boolean contributors_enabled;
@JsonProperty
String url;
@JsonProperty
boolean default_profile;
@JsonProperty
long utc_offset;
@JsonProperty
long id;
@JsonProperty
boolean profile_use_background_image;
@JsonProperty
int listed_count;
@JsonProperty
String lang;
@JsonProperty("protected")
@SerializedName("protected")
boolean isProtected;
@JsonProperty
int followers_count;
@JsonProperty
String profile_text_color;
@JsonProperty
String profile_background_color;
@JsonProperty
String time_zone;
@JsonProperty
String description;
@JsonProperty
boolean notifications;
@JsonProperty
boolean geo_enabled;
@JsonProperty
boolean verified;
@JsonProperty
String profile_background_image_url;
@JsonProperty
boolean defalut_profile_image;
@JsonProperty
int friends_count;
@JsonProperty
int statuses_count;
@JsonProperty
String screen_name;
@JsonProperty
boolean following;
@JsonProperty
boolean show_all_inline_media;
}
static class Feed {
@JsonProperty
String id;
@JsonProperty
String title;
@JsonProperty
String description;
@JsonProperty("alternate")
@SerializedName("alternate")
List alternates;
@JsonProperty
long updated;
@JsonProperty
List