From fb55486dcabb07fcb27471dca9dde29ee904e53d Mon Sep 17 00:00:00 2001 From: SamYuan1990 Date: Sun, 10 Jan 2021 23:22:22 +0800 Subject: [PATCH] adding benchmark Signed-off-by: SamYuan1990 --- azure-pipelines.yml | 8 ++ build.gradle | 13 ++- gradle/wrapper/gradle-wrapper.properties | 2 +- src/jmh/java/SM2UtilBenchmark.java | 93 +++++++++++++++++++ src/main/java/{ => javagm}/SM2Util.java | 2 + src/main/java/{ => javagm}/SM3Util.java | 2 + src/main/java/{ => javagm}/SM4Util.java | 2 + src/test/java/{ => javagm}/SM2UtilTest.java | 2 + src/test/java/{ => javagm}/SM3UtilTest.java | 2 + src/test/java/{ => javagm}/SM4Interation.java | 2 + src/test/java/{ => javagm}/SM4UtilTest.java | 2 + 11 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 src/jmh/java/SM2UtilBenchmark.java rename src/main/java/{ => javagm}/SM2Util.java (99%) rename src/main/java/{ => javagm}/SM3Util.java (94%) rename src/main/java/{ => javagm}/SM4Util.java (97%) rename src/test/java/{ => javagm}/SM2UtilTest.java (99%) rename src/test/java/{ => javagm}/SM3UtilTest.java (92%) rename src/test/java/{ => javagm}/SM4Interation.java (98%) rename src/test/java/{ => javagm}/SM4UtilTest.java (96%) diff --git a/azure-pipelines.yml b/azure-pipelines.yml index ba302e2..e96013f 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -25,6 +25,14 @@ jobs: publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' tasks: 'build' + + - job: benchmark + dependsOn: + - ut + steps: + - script: + gradle jmh + - job: releaseJar dependsOn: - ut diff --git a/build.gradle b/build.gradle index 3b5b838..9512aa8 100644 --- a/build.gradle +++ b/build.gradle @@ -2,6 +2,7 @@ plugins { id 'java' id 'checkstyle' id 'maven-publish' + id "me.champeau.gradle.jmh" version "0.5.2" } group 'twgc' @@ -15,7 +16,7 @@ allprojects { maven { url 'https://maven.aliyun.com/repository/public/' } - mavenLocal() + //mavenLocal() mavenCentral() } } @@ -28,6 +29,10 @@ tasks.withType(Test) { systemProperty "file.encoding", "UTF-8" } +jmh { + zip64 = false +} + checkstyle { toolVersion '6.11.1' showViolations true @@ -68,4 +73,8 @@ dependencies { implementation group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.67' testCompile group: 'junit', name: 'junit', version: '4.12' testCompile group: 'org.apache.commons', name: 'commons-lang3', version: '3.11' -} + jmh 'org.apache.commons:commons-lang3:3.11' + jmh 'org.openjdk.jmh:jmh-core:1.25' + jmh 'org.openjdk.jmh:jmh-generator-annprocess:1.25' + jmh group: 'org.bouncycastle', name: 'bcpkix-jdk15on', version: '1.67' +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 44e7c4d..a4b4429 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/src/jmh/java/SM2UtilBenchmark.java b/src/jmh/java/SM2UtilBenchmark.java new file mode 100644 index 0000000..392d929 --- /dev/null +++ b/src/jmh/java/SM2UtilBenchmark.java @@ -0,0 +1,93 @@ +package javagm; + +import java.security.*; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.RandomStringUtils; +import org.bouncycastle.crypto.InvalidCipherTextException; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Thread) //Thread: 该状态为每个线程独享。 +public class SM2UtilBenchmark { + + @State(Scope.Thread) + public static class BenchmarkState { + static int randomData = 128; + static byte[] message = RandomStringUtils.random(randomData).getBytes(); + SM2Util instance; + KeyPair keyPair; + PublicKey pubKey; + PrivateKey privKey; + byte[] signbyte; + byte[] encrypted; + { + try { + instance = new SM2Util(); + keyPair = instance.generatekeyPair(); + pubKey = keyPair.getPublic(); + privKey = keyPair.getPrivate(); + signbyte = instance.sign(this.privKey, message); + encrypted = instance.encrypt(this.pubKey, message); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + @Benchmark + public void sign(BenchmarkState state) { + try { + state.instance.sign(state.privKey, state.message); + } catch (SignatureException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } + } + + @Benchmark + public void verify(BenchmarkState state) { + try { + state.instance.verify(state.pubKey, state.message, state.signbyte); + } catch (SignatureException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } + } + + @Benchmark + public void encrypt(BenchmarkState state) { + try { + state.instance.encrypt(state.pubKey, state.message); + } catch (InvalidCipherTextException e) { + e.printStackTrace(); + } + } + + @Benchmark + public void decrypt(BenchmarkState state) { + try { + state.instance.decrypt(state.privKey, state.encrypted); + } catch (InvalidCipherTextException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(SM2UtilBenchmark.class.getSimpleName()) //benchmark 所在的类的名字,注意这里是使用正则表达式对所有类进行匹配的 + .forks(1) //进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试 + .warmupIterations(3) //预热的迭代次数 + .measurementIterations(5) //实际测量的迭代次数 + .build(); + + new Runner(opt).run(); + } +} diff --git a/src/main/java/SM2Util.java b/src/main/java/javagm/SM2Util.java similarity index 99% rename from src/main/java/SM2Util.java rename to src/main/java/javagm/SM2Util.java index 1e3b719..d6de539 100644 --- a/src/main/java/SM2Util.java +++ b/src/main/java/javagm/SM2Util.java @@ -1,3 +1,5 @@ +package javagm; + import java.io.File; import java.io.FileReader; import java.io.IOException; diff --git a/src/main/java/SM3Util.java b/src/main/java/javagm/SM3Util.java similarity index 94% rename from src/main/java/SM3Util.java rename to src/main/java/javagm/SM3Util.java index d93cf4a..a13ba02 100644 --- a/src/main/java/SM3Util.java +++ b/src/main/java/javagm/SM3Util.java @@ -1,3 +1,5 @@ +package javagm; + import java.security.Security; import java.util.Arrays; diff --git a/src/main/java/SM4Util.java b/src/main/java/javagm/SM4Util.java similarity index 97% rename from src/main/java/SM4Util.java rename to src/main/java/javagm/SM4Util.java index 3cf18d5..39b6cc4 100644 --- a/src/main/java/SM4Util.java +++ b/src/main/java/javagm/SM4Util.java @@ -1,3 +1,5 @@ +package javagm; + import java.security.*; import java.util.EnumMap; import javax.crypto.*; diff --git a/src/test/java/SM2UtilTest.java b/src/test/java/javagm/SM2UtilTest.java similarity index 99% rename from src/test/java/SM2UtilTest.java rename to src/test/java/javagm/SM2UtilTest.java index 6a1e16e..0239ff2 100644 --- a/src/test/java/SM2UtilTest.java +++ b/src/test/java/javagm/SM2UtilTest.java @@ -1,3 +1,5 @@ +package javagm; + import java.io.File; import java.io.IOException; import java.nio.file.Files; diff --git a/src/test/java/SM3UtilTest.java b/src/test/java/javagm/SM3UtilTest.java similarity index 92% rename from src/test/java/SM3UtilTest.java rename to src/test/java/javagm/SM3UtilTest.java index 782dfcc..fcad124 100644 --- a/src/test/java/SM3UtilTest.java +++ b/src/test/java/javagm/SM3UtilTest.java @@ -1,3 +1,5 @@ +package javagm; + import org.apache.commons.lang3.RandomStringUtils; import org.junit.Assert; import org.junit.Test; diff --git a/src/test/java/SM4Interation.java b/src/test/java/javagm/SM4Interation.java similarity index 98% rename from src/test/java/SM4Interation.java rename to src/test/java/javagm/SM4Interation.java index 3f35fca..79c7f23 100644 --- a/src/test/java/SM4Interation.java +++ b/src/test/java/javagm/SM4Interation.java @@ -1,3 +1,5 @@ +package javagm; + import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import org.junit.Assert; import org.junit.Test; diff --git a/src/test/java/SM4UtilTest.java b/src/test/java/javagm/SM4UtilTest.java similarity index 96% rename from src/test/java/SM4UtilTest.java rename to src/test/java/javagm/SM4UtilTest.java index 44879f7..bb0f269 100644 --- a/src/test/java/SM4UtilTest.java +++ b/src/test/java/javagm/SM4UtilTest.java @@ -1,3 +1,5 @@ +package javagm; + import java.nio.charset.Charset; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException;