diff options
| author | davidhofman | 2021-09-15 12:11:14 +0200 |
|---|---|---|
| committer | GitHub | 2021-09-15 12:11:14 +0200 |
| commit | bd9de73be52f738b6346e5003b79114d212666bc (patch) | |
| tree | a09e5e5e11547f9e58e237ecd1f5ff7bfc173ee0 /src/cz/crcs/ectester/standalone/test/base | |
| parent | 69ce36e4537be52c103e8b5a314cca49cc931d8f (diff) | |
| download | ECTester-bd9de73be52f738b6346e5003b79114d212666bc.tar.gz ECTester-bd9de73be52f738b6346e5003b79114d212666bc.tar.zst ECTester-bd9de73be52f738b6346e5003b79114d212666bc.zip | |
Implement StandalonePerformanceSuite. (#13)
* add PerformanceTest.
* Add and implement StandalonePerformanceSuite.
* Add author information.
* Add missing null check to signature performance tests.
* Fix reset method in KeyAgreementTestable.
Diffstat (limited to 'src/cz/crcs/ectester/standalone/test/base')
| -rw-r--r-- | src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java | 9 | ||||
| -rw-r--r-- | src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java | 109 |
2 files changed, 118 insertions, 0 deletions
diff --git a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java b/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java index 1382c28..7fd1c5a 100644 --- a/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java +++ b/src/cz/crcs/ectester/standalone/test/base/KeyAgreementTestable.java @@ -4,6 +4,7 @@ import javax.crypto.KeyAgreement; import javax.crypto.SecretKey; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; import java.security.interfaces.ECPrivateKey; import java.security.interfaces.ECPublicKey; import java.security.spec.AlgorithmParameterSpec; @@ -160,6 +161,14 @@ public class KeyAgreementTestable extends StandaloneTestable<KeyAgreementTestabl hasRun = true; } + @Override + public void reset() { + super.reset(); + try { + ka = KeyAgreement.getInstance(ka.getAlgorithm(), ka.getProvider()); + } catch (NoSuchAlgorithmException e) { } + } + public enum KeyAgreementStage { GetPrivate, GetPublic, diff --git a/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java b/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java new file mode 100644 index 0000000..258ca12 --- /dev/null +++ b/src/cz/crcs/ectester/standalone/test/base/PerformanceTest.java @@ -0,0 +1,109 @@ +package cz.crcs.ectester.standalone.test.base; + +import cz.crcs.ectester.common.test.BaseTestable; +import cz.crcs.ectester.common.test.Result; +import cz.crcs.ectester.common.test.SimpleTest; +import cz.crcs.ectester.common.test.TestCallback; + +import java.util.Arrays; + +/** + * @author David Hofman + */ +public class PerformanceTest extends SimpleTest<BaseTestable> { + private long[] times; + private long mean; + private long median; + private long mode; + private final int count; + private final String desc; + + private PerformanceTest(BaseTestable testable, int count, String desc) { + super(testable, new TestCallback<BaseTestable>() { + @Override + public Result apply(BaseTestable testable) { + return new Result(Result.Value.SUCCESS); + } + }); + this.count = count; + this.desc = desc; + } + + public static PerformanceTest repeat(BaseTestable testable, int count) { + return new PerformanceTest(testable, count, null); + } + + public static PerformanceTest repeat(BaseTestable testable, String desc, int count) { + return new PerformanceTest(testable, count, desc); + } + + @Override + public String getDescription() { + String rest = String.format("Mean = %d ns, Median = %d ns, Mode = %d ns", mean, median, mode); + return (desc == null ? rest : desc + " (" + rest + ")"); + } + + @Override + protected void runSelf() { + + times = new long[count]; + for (int i = 0; i < count; ++i) { + times[i] = measureTime(); + } + + mean = Arrays.stream(times).sum() / count; + + long[] sorted = times.clone(); + Arrays.sort(sorted); + if (count % 2 == 0) { + median = (sorted[(count / 2) - 1] + sorted[count / 2]) / 2; + } else { + median = sorted[count / 2]; + } + + long max_occurrences = 0; + int i = 0; + while (i < count) { + long current_value = sorted[i]; + long current_occurrences = 0; + while (i < count && sorted[i] == current_value) { + i++; + current_occurrences++; + } + if (current_occurrences > max_occurrences) { + max_occurrences = current_occurrences; + mode = current_value; + } + } + result = callback.apply(testable); + } + + public long getCount() { + return count; + } + + public long[] getTimes() { + return times; + } + + public long getMean() { + return mean; + } + + public long getMedian() { + return median; + } + + public long getMode() { + return mode; + } + + private long measureTime() { + if(testable.hasRun()) { + testable.reset(); + } + long startTime = System.nanoTime(); + testable.run(); + return System.nanoTime() - startTime; + } +} |
