(original) (raw)

package org.sample; 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.Setup; import org.openjdk.jmh.annotations.State; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.infra.BenchmarkParams; import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.util.Random; import java.util.concurrent.TimeUnit; @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.MICROSECONDS) @Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS) @Measurement(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS) @Fork(1) @State(Scope.Benchmark) public class GHash { private Constructor GHASH; private Method UPDATE; Object hash; byte[] data; @Benchmark public void calculateGHash() throws Exception { UPDATE.invoke(hash, data); } @Setup public void setup(BenchmarkParams params) throws Exception { String className = "com.sun.crypto.provider.GHASH"; Class cls = Class.forName(className); GHASH = cls.getDeclaredConstructor(byte[].class); GHASH.setAccessible(true); UPDATE = cls.getDeclaredMethod("update", byte[].class); UPDATE.setAccessible(true); byte[] h = new byte[16]; Random rand = new Random(); rand.nextBytes(h); hash = GHASH.newInstance(h); data = new byte[4*1024]; rand.nextBytes(data); } }