实测apache-common-lang3 StringUtil

2018-12-30  本文已影响0人  鹅鹅鹅_

一般来说,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
上一篇下一篇

猜你喜欢

热点阅读