try-catch有性能损失吗

目录
一、实例代码
二、@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异常表范围小点

image-20230305201527531.png

四、查阅书籍资料【Effective Java】


image-20230305203430331.png

五、总结
(1)try-catch 相比较没 try-catch,确实有一定的性能影响,但不是不让用 try-catch。业务上不用回避
(2)for循环内用 try-catch 和用 try-catch 包裹整个 for 循环性能差不多,本质上是业务处理方式的不同,跟性能扯不上关系,关键看你的业务流程处理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容