package com.jsoniter.demo; import com.jsoniter.any.Any; import com.jsoniter.JsonIterator; import com.jsoniter.Slice; import com.jsoniter.output.JsonStream; import org.junit.Test; 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.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @State(Scope.Thread) public class LazyAny { private JsonIterator iter; private Slice input; @Setup(Level.Trial) public void benchSetup(BenchmarkParams params) throws IOException { InputStream resourceAsStream = LazyAny.class.getResourceAsStream("/large.json"); byte[] buf = new byte[32 * 1024]; int size = resourceAsStream.read(buf); input = new Slice(buf, 0, size); iter = new JsonIterator(); } public static void main(String[] args) throws Exception { Main.main(new String[]{ "LazyAny", "-i", "5", "-wi", "5", "-f", "1", "-prof", "stack", }); } public static class User { public int index; public String name; } @Test public void test() throws IOException { benchSetup(null); System.out.println(jsoniter()); System.out.println(jsoniter_object()); User tom = new User(); tom.index = 1; tom.name = "tom"; Map<String, Any> tomAsMap = Any.wrap(tom).asMap(); tomAsMap.put("age", Any.wrap(17)); System.out.println(JsonStream.serialize(tomAsMap)); } @Benchmark public void jsoniter(Blackhole bh) throws IOException { bh.consume(jsoniter()); } @Benchmark public void jsoniter_object(Blackhole bh) throws IOException { bh.consume(jsoniter_object()); } public int jsoniter() throws IOException { iter.reset(input); Any users = iter.readAny(); int total = 0; for (Any user : users) { total += user.get("friends").size(); } return total; } public int jsoniter_object() throws IOException { iter.reset(input); List users = (List) iter.read(); int total = 0; for (Object userObj : users) { Map user = (Map) userObj; List friends = (List) user.get("friends"); total += friends.size(); } return total; } }