目录
一、实例代码
二、@Benchmark配置
三、@Benchmark + 字节码对比结果
四、查阅书籍资料【Effective Java】
五、总结
#1.实例代码
package com.fong.utils.other.benchmark;
import org.junit.Test;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.results.format.ResultFormatType;
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 java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 2, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@Threads(2)
public class TryCatchTest {
@Test
public void test1 () throws RunnerException {
Options options = new OptionsBuilder().include(TryCatchTest.class.getSimpleName())
.resultFormat(ResultFormatType.JSON)
.build();
new Runner(options).run();
}
@Benchmark
public void doTryfor() {
// 外部try
tryfor();
}
@Benchmark
public void doFortry() {
// 内部try
fortry();
}
public void tryfor() {
int sum = 0;
try {
for (int i = 0; i < 5000; i++) {
sum++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void fortry() {
int sum = 0;
for (int i = 0; i < 5000; i++) {
try {
sum++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
二、@Benchmark配置
#1.引入maven配置
(1)JMH: 即Java Microbenchmark Harness 翻译:java 微基准测试 工具套件。
(2)测试性能需引入JMH, JDK12已经包含此jar包
(3)maven
<!--benchmark测试-->
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-core</artifactId>
<version>${jmh.version}</version>
</dependency>
<dependency>
<groupId>org.openjdk.jmh</groupId>
<artifactId>jmh-generator-annprocess</artifactId>
<version>${jmh.version}</version>
<!-- 正确设置 -->
<scope>provided</scope>
</dependency>
三、@Benchmark + 字节码对比结果
(1)分数:(数字越大越好)其实差不多
(2)字节码: 都大差不差, 只是fortry异常表范围小点
四、查阅书籍资料【Effective Java】
五、总结
(1)try-catch 相比较没 try-catch,确实有一定的性能影响,但不是不让用 try-catch。业务上不用回避
(2)for循环内用 try-catch 和用 try-catch 包裹整个 for 循环性能差不多,本质上是业务处理方式的不同,跟性能扯不上关系,关键看你的业务流程处理。