package cache; import com.google.common.base.Optional; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; import org.openjdk.jmh.annotations.Measurement; import org.openjdk.jmh.annotations.Mode; import org.openjdk.jmh.annotations.OutputTimeUnit; import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Threads; import org.openjdk.jmh.annotations.Warmup; import java.util.concurrent.TimeUnit; import javax.annotation.Nonnull; @Fork(2) @State(Scope.Benchmark) @Threads(4) @Warmup(iterations = 5) @Measurement(iterations = 5) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) public class CacheReadBenchmark { static final String[] GENERIC_ARGS = new String[] {"java.lang.String", "java.lang.Long", "java.lang.Integer", "java.lang.Short", "java.lang.Character", "java.lang.Byte", "io.scalecube.transport.protocol.MessageSchema",}; static final String[] GENERIC_ARGS_CACHE_MISS = new String[] {"java.lang.String", "xyz", "java.lang.Integer", "abc", "java.lang.Character", "qwerty", "io.scalecube.transport.protocol.MessageSchema",}; LoadingCache<String, Optional<Class>> guavaCache = CacheBuilder.newBuilder().build( new CacheLoader<String, Optional<Class>>() { @Override public Optional<Class> load(@Nonnull String className) { try { Class dataClass = Class.forName(className); return Optional.of(dataClass); } catch (ClassNotFoundException e) { return Optional.absent(); } } }); @Benchmark public void readFromGuavaCache() { for (String arg : GENERIC_ARGS) { guavaCache.getUnchecked(arg); } } @Benchmark public void readFromGuavaWithCacheMiss() { for (String arg : GENERIC_ARGS_CACHE_MISS) { guavaCache.getUnchecked(arg); } } }