我创建了一个新的加密算法。它完全牢不可破,速度极快。我称之为 ROT-13。现在我想对它做一些基准测试来证明我的速度。但是,我不仅想一遍又一遍地加密和解密相同的明文,因为这会导致在现实中不会发生的分支预测;相反,我想在测量函数之外生成一些随机明文并将其注入。
我以为我可以做类似的事情
public class Rot13Benchmark{
public String plaintext;
@Setup(Level.invocation)
public void setup(){
plaintext = randomString();
}
@Benchmark
public String rot13Benchmark(){
return rot13(plaintext);
}
}
但根据Level.invocation
上的文档——
警告:这里是龙!
。
此级别仅适用于需要超过一毫秒的基准测试...
由于rot13
的调用预计不会超过一毫秒,因此这对我来说似乎不是正确的选择。
向我的 JMH 基准测试函数提供随机输入的正确方法是什么,以便随机输入生成时间不计入基准测试?
如何在 Thread 范围内创建一个状态类,在安装时将创建和缓存一堆字符串,然后在公共方法中一个接一个地将它们吐出。
明显的缺点是: 1. 需要估计在执行之前需要准备多少个字符串。 2.它将包括在基准测试中执行get方法,但是您可以在下一步中单独对get方法进行基准测试并分析差异。
这不是理想的解决方案,但我想出的最好的解决方案。
@State(Scope.Thread)
public static class InputClass {
public List<String> testList;
int index = 0;
@Setup(Level.Iteration)
public void setUp() {
testList = //generation of random elements;
}
public String get(){
return testList.get(index++);
}
}
@Benchmark
public void rot13Benchmark(InputClass inputClass){
return rot13(inputClass.get());
}
只需创建一个随机字符串。这可能需要一些时间,因为您也想加密更大的部分,不是吗?
RandomStringGenerator generator = new RandomStringGenerator.Builder()
.withinRange('a', 'z')
.build();
String randomLetters = generator.generate(20);
生成一个字符串,存储它,然后对你的算法进行基准测试
public class Rot13Benchmark{
public String plaintext;
@Setup(Level.invocation)
public void setup(){
plaintext = randomString(1000);
}
@Benchmark
public String rot13Benchmark(){
return rot13(plaintext);
}
public String randomString(int length){
RandomStringGenerator generator = new RandomStringGenerator.Builder()
.withinRange('a', 'z')
.build();
return generator.generate(length);
}
}