1. 程式人生 > 實用技巧 >效能測試JMH

效能測試JMH

生成檢視的網站(在跑效能測試時指定生成json格式的結果,再上傳到此網站視覺化):http://deepoove.com/jmh-visual-chart/

參考文件

  1. https://www.xncoding.com/2018/01/07/java/jmh.html

實戰

  1. 新增pom依賴
        <!-- JMH-->
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.25.2</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.25.2</version>
            <scope>provided</scope>
        </dependency>
  1. 增加效能測試類,在需要做效能測試的方法上新增@Benchnmark註解
    場景:驗證字串拼接的效能差異
@BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 3)
@Measurement(iterations = 10, time = 5, timeUnit = TimeUnit.SECONDS)
@Threads(8)
@Fork(2)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
public class StringBuilderBenchmark {

        @Benchmark
        public void testStringAdd() {
            String a = "";
            for (int i = 0; i < 10; i++) {
                a += i;
            }
            print(a);
        }

        @Benchmark
        public void testStringBuilderAdd() {
            StringBuilder stringBuilder = new StringBuilder();
            for (int i = 0; i < 10; i++) {
                stringBuilder.append(i);
            }
            print(stringBuilder.toString());
        }

        private void print(String a) {
        }

        // 生成json格式的結果,預設是生成log格式的
        public static void main(String []args) throws RunnerException {
            org.openjdk.jmh.runner.options.Options options = new OptionsBuilder()
                    .include(StringBuilderBenchmark.class.getSimpleName())
                    .shouldDoGC(true)
                    .resultFormat(ResultFormatType.JSON)
                    .result("benchmark-result.json")
                    .addProfiler(StackProfiler.class)
                    .jvmArgsAppend("-Djmh.stack.period=1")
                    .warmupIterations(5)
                    .measurementIterations(5)
                    .forks(1)
                    .build();
            new Runner(options).run();
        }
}