JMH使微基准测试更容易:
更新:将输入字符串设置为参数,以解决JMH God Alexey Shipilev的评论.我将目标字符串保持不变,因为OP的用例是将输入字符串与常量进行比较.
@State(Benchmark)
public class StrComp {
@Param({"Queen", "queen", "King"})
public String input;
@Benchmark
public boolean eqIgnoreCase() {
return input.equalsIgnoreCase("queen");
}
@Benchmark
public boolean eqToLower() {
return input.toLowerCase().equals("queen");
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(".*StrComp.*")
.mode(Mode.AverageTime)
.timeUnit(TimeUnit.NANOSECONDS)
.forks(5)
.warmupIterations(10)
.measurementIterations(10)
.build();
new Runner(opt).run();
}
}
并输出:
Benchmark Mode Cnt Score Error Units
StrComp.eqIgnoreCase avgt 50 18.581 ± 0.051 ns/op
StrComp.eqToLower avgt 50 54.796 ± 0.173 ns/op
使用参数更新输出:
Benchmark (input) Mode Cnt Score Error Units
StrComp.eqIgnoreCase Queen avgt 50 17.947 ± 0.205 ns/op
StrComp.eqIgnoreCase queen avgt 50 15.553 ± 0.159 ns/op
StrComp.eqIgnoreCase King avgt 50 2.968 ± 0.037 ns/op
StrComp.eqToLower Queen avgt 50 56.499 ± 0.180 ns/op
StrComp.eqToLower queen avgt 50 22.023 ± 0.040 ns/op
StrComp.eqToLower King avgt 50 49.174 ± 0.145 ns/op
因此,eqIgnoreCase更快,但除非你每秒进行一百万次比较,否则你不会发现任何差异.
如果第一个字符串已经是小写或者字符串的长度不同等,你可以四处看看并看看差异会受到什么影响.
无论如何,如果你想让你的代码更“高效”,也更清晰,类型安全且不易出错,不要使用字符串来做这样的事情.使用枚举.