一般来说,String.replace 方法工作得很好,而且非常高效,特别是如果你使用的是Java 9。但是,如果应用程序需要大量的替换操作,并且你还没有更新到最新的Java版本,那么检查更快和更有效的替代方案仍然是有意义的。
当然,上面一段话来自网络:),而且网络上关于StringUtils的介绍都是很多年前的,貌似最近几年没有相关的介绍了,但是apache依然在更新StringUtils。
那么,StringUtils类值得使用吗?值不值得,测试一下就知道!Just test it。
本文结论是在Java8中值得使用,本文的基准测试全部基于Java8,若你使用的是Java其他版本,请使用JMH仔细测试,然后再决定要不要使用StringUtils进行优化。
本文测试代码可以在JMH-Example下载
- 测试代码
package jmh.benchmarks;
import org.apache.commons.lang3.StringUtils;
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;
import org.openjdk.jmh.runner.options.TimeValue;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@State(Scope.Thread) //Thread: 该状态为每个线程独享。
public class StringUtilsBenchmark {
@Benchmark
public void utilsReplace() {
StringUtils.replace("jmh string utils replace", "utils", "");
}
@Benchmark
public void replace() {
"jmh string utils replace".replace("utils", "");
}
@Benchmark
public void utilsSplit() {
StringUtils.split("jmh string utils replace", " ");
}
@Benchmark
public void split() {
"jmh string utils replace".split("");
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(StringUtilsBenchmark.class.getSimpleName()) //benchmark 所在的类的名字,注意这里是使用正则表达式对所有类进行匹配的
.forks(1) //进行 fork 的次数。如果 fork 数是2的话,则 JMH 会 fork 出两个进程来进行测试
.warmupIterations(2) //预热的迭代次数
.warmupTime(TimeValue.valueOf("2"))
.measurementIterations(5) //实际测量的迭代次数
.measurementTime(TimeValue.valueOf("3"))
.build();
new Runner(opt).run();
}
}
- 测试结果
Benchmark Mode Cnt Score Error Units
StringUtilsBenchmark.replace avgt 5 0.459 ± 0.062 us/op
StringUtilsBenchmark.split avgt 5 1.251 ± 0.053 us/op
StringUtilsBenchmark.utilsReplace avgt 5 0.089 ± 0.004 us/op
StringUtilsBenchmark.utilsSplit avgt 5 0.175 ± 0.006 us/op
- 结论
测试结果证明在Java8中使用StringUtils进行字符串replace、split,其效率远高于java8再带的api,尽请放心的优化吧。
网友评论