Java性能优化-测试try-catch放在循环内和外的性能对比与业务区别

news2024/11/27 20:21:56

场景

Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化:

Java中使用JMH(Java Microbenchmark Harness 微基准测试框架)进行性能测试和优化_霸道流氓气质的博客-CSDN博客

使用如上方式测试Java中try-catch放在循环内和循环外是否有性能上的差别。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、是否有听闻:try-catch放在循环体内执⾏会很慢?

为了验证以上结论,做如下测试

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 java.util.concurrent.TimeUnit;


@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 2,time = 1,timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5,time = 5,timeUnit = TimeUnit.SECONDS)
@Fork(1)
@State(Scope.Benchmark)
@Threads(100)
public class TryCatchVSCircleTest {

    private static final int maxSize = 10000; //测试循环次数

    public static void main(String[] args) throws RunnerException {
        //启动基准测试
        Options opt = new OptionsBuilder()
                .include(TryCatchVSCircleTest.class.getSimpleName())  //要导入的测试类
                .build();
        //执行测试
        new Runner(opt).run();
    }

    @Benchmark
    public int innerForeach(){
        int count = 0;
        for (int i = 0; i < maxSize; i++) {
            try{
                if(i == maxSize){
                    throw new Exception("exception");
                }
                count++;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return count;
    }

    @Benchmark
    public int outerForeach(){
        int count = 0;
        try{
            for (int i = 0; i < maxSize; i++) {
                if(i == maxSize){
                    throw new Exception("exception");
                }
                count++;
            }
        }catch (Exception e){
            e.printStackTrace();
        }
       return count;
    }
}

测试结果

Benchmark                          Mode  Cnt      Score     Error  Units
TryCatchVSCircleTest.innerForeach  avgt    5  13528.011 ± 833.369  ns/op
TryCatchVSCircleTest.outerForeach  avgt    5  13645.087 ± 565.900  ns/op

2、结论

在没有发⽣异常的情况下,除去误差值,我们得到的结论是:

try-catch ⽆论是在 for 循环内还是 for 循环外,它们的性能相同,⼏乎没有任何差别。

通过分析其字节码可知:

如果如果代码不出错的话,性能⼏乎是不受影响的,和正常的代码的执⾏逻辑是⼀样的。

虽然 try-catch 在循环体内还是循环体外的性能是类似的,但是它们所代码的业务含义却完全不同,

在循环体内的 try-catch 在发⽣异常之后,可以继续执⾏循环;⽽循环外的 try-catch 在发⽣异

常之后会终⽌循环。

因此我们在决定 try-catch 究竟是应该放在循环内还是循环外,不取决于性能(因为性能⼏乎相同),

⽽是应该取决于具体的业务场景。

例如我们需要处理⼀批数据,⽽⽆论这组数据中有哪⼀个数据有问题,都不能影响请他组的正常执⾏

,此时我们可以把 try-catch 放置在循环体内;

⽽当我们需要计算⼀组数据的合计值时,只要有⼀组数据有误,我们就需要终⽌执⾏,并抛出异常,

此时我们需要将 try-catch 放置在循环体外来执⾏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759669.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NiuBi!简单且匿名的密码喷洒工具

工具介绍 通过 Amazon AWS 直通代理启动密码喷洒/暴力破解&#xff0c;为每次身份验证尝试转移请求的 IP 地址。这会动态创建 FireProx API&#xff0c;以实现更规避的密码喷射。 关注【Hack分享吧】公众号&#xff0c;回复关键字【230525】获取下载链接 小心帐户锁定&#xf…

Java 设计模式——工厂方法模式

目录 1.案例分析2.简单工厂模式2.1.结构2.2.案例实现2.2.1.抽象产品2.2.2.具体产品2.2.3.具体工厂2.2.4.测试 2.3.优缺点2.4.扩展 3.✨工厂方法模式3.1.介绍3.1.结构3.2.案例实现3.2.1.抽象工厂3.2.2.具体工厂3.2.3.测试 3.3.优缺点3.4.应用场景 1.案例分析 【需求】设计一个咖…

python获取职教云信息

⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;努力输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;项目。 目录 1、需求1.1、推荐课程1.2、课程详情 2、思路分析2.1、推荐课程完整代码 2.2、课程详情找到JSON数据…

4.2.tensorRT基础(1)-第一个trt程序,实现模型编译的过程

目录 前言1. hello案例2. 补充知识总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 基础-第一个 trt 程序&#x…

SlickGrid学习

options&#xff1a; 选项 设置 enableCellNavigation 启用单元格导航&#xff0c;可以点单元格 enableColumnReorder 启动拖拽列 example-colspan.html 跨列实例 AutoTooltips plugin 隐藏列文字时自动显现列标题全文 Checkbox row select column 增加选择列来选择行…

STM32入门学习之core_cm3问题

1.安装了keil之后&#xff0c;新建工程出现几百个关于core_cm3的问题&#xff0c;百思不得其解。后在网上查阅资料后&#xff0c;了解到可能是keil版本的问题&#xff0c;是因为我下载的keill版本太高了&#xff0c;内部不支持ARM5.06的编译器。出现很多关于core_cm3的问题是因…

使用java语言制作一个窗体(弹窗),用来收集用户输入的内容

前言 最近做的一个需求&#xff0c;有个逻辑环节是&#xff1a;需要从本地保存的xml文件中取出一个值&#xff0c;这个值是会变化的。然后项目经理就给我说&#xff0c;你能不能做一个小工具&#xff0c;让用户可以直接通过界面化操作将这个变化的值写入文件&#xff0c;不用再…

rv1126交叉编译

目录 一、解压sdk二、交叉编译出动态库sqlite3交叉编译opencv交叉编译一、解压sdk tar xzvf rv1126_rv1109_linux_sdk_v1.8.0_PureVersion.tar.gz 查看交叉编译工具链 pwd查看绝对路径/home

正斜杠“/” 和反斜杠 “\” 傻傻分不清?

Note, on your keyboard, the location of two different punctuation marks—/, or forward slash, and \, or backward slash (also known as backslash). As you read from left to right, the forward slash falls forward while the backslash falls backward; 引用自 《…

js逆向思路-区分各个瑞数版本vmp/3/4/5/6代

目录 一、如何区分是最新瑞数vmp反爬二、3/4/5/6代/vmp版本的瑞数网站特征举例三、瑞数反爬的解决思路四、推荐相关瑞数文章五、一些心得一、如何区分是最新瑞数vmp反爬 前言:本篇文章不会介绍详细的解决反爬的算法扣代码过程,只是一些经验闲谈,文章的末尾有相关的好的质量的…

油猴脚本-Bilibili剧场模式仿Youtube

对比某个不存在的视频网站&#xff08;YouTube&#xff09;&#xff0c;以及B站的播放模式&#xff0c;普通模式以及网页全屏之间都有一个“中间档”&#xff0c;油管的叫 剧场模式&#xff0c;B站的叫 宽屏模式。 剧场模式 宽屏模式 相比之下&#xff0c;还是更喜欢油管的剧…

10.带你入门matlab频率表、盒图(matlab程序)

1.简述 相关概念介绍 以信号为例&#xff0c;信号在时域下的图形可以显示信号如何随着时间变化&#xff0c;而信号在频域下的图形&#xff08;一般称为频谱&#xff09;可以显示信号分布在哪些频率及其比例。频域的表示法除了有各个频率下的大小外&#xff0c;也会有各个频率的…

《遗留系统现代化》读书笔记(基础篇)

你现在所写的每一行代码&#xff0c;都是未来的遗留系统 为什么要对遗留系统进行现代化&#xff1f; 什么是遗留系统&#xff1f; 判断遗留系统的几个维度&#xff1a;代码、架构、测试、DevOps 以及技术和工具。时间长短并不是衡量遗留系统的标准。代码质量差、架构混乱、没…

【C++】多线程编程系列总纲

本系列文章主要介绍C11并发编程&#xff0c;主要包括如下篇目&#xff1a; 1、多线程编程一&#xff08;初识并发和多线程&#xff09; https://blog.csdn.net/Jacky_Feng/article/details/131751373?csdn_share_tail{"type"%3A"blog"%2C"rType&qu…

idea快捷方式,(主要是自己用的,持续收集)

编辑器 代码光标扩大选中 快捷键名字 使用方式 此时光标在这这里,按一下发现选中面积扩大, 如果再按快捷键,选中面积还扩大

带你【玩转Linux命令】➾ find cut 每天2个day06

带你【玩转Linux命令】➾ find & cut 每天2个day06 &#x1f53b; 一、文件管理命令1.1 find-查找文件或目录1.2 cut-指定欲显示的文件内容&#xff0c;输出到标准输出设备 &#x1f53b; 总结—温故知新 &#x1f53b; 一、文件管理命令 1.1 find-查找文件或目录 &#x…

【Nacos】基于k8s容器化部署Nacos集群

近期&#xff0c;在机器上部署了三个节点的nacos集群服务用于几个小型微服务的注册配置中心&#xff0c;并使用了Nginx简单代理了一下&#xff0c;随即简单研究了下集群部署分布式部署稍微提高可用性。部署完后能够正常使用&#xff0c;但是发现一个问题&#xff0c;刷新Nacos集…

制作文件间链接

制作文件间链接 管理文件间链接 硬/软链接 创建指向同一个文件的多个名称。 创建硬链接 从初始名称到文件系统的数据&#xff0c;每个文件都以一个硬链接开始。当创建指向文件的新硬链接时,也会创建另一个指向同一数据的名称。新硬链接与原始文件名作用相同。一经创建&…

Maya适合哪个工作站?

Autodesk Maya 提供多种功能&#xff0c;可以适应电影、游戏和建筑等不同行业的需求。定制的 Autodesk Maya 工作站可以帮助您提高行业领先的 3D 计算机动画、建模、模拟和渲染软件的工作效率和用户体验。 根据您的特定需求定制的快速、强大的工作站可以帮助您充分利用 Maya 工…

高薪Offer收割机之Redis分布式锁

锁在应用开发中使用非常广泛,哪些场景需要使用锁呢? 我们先来看抢购优惠卷的场景,代码如下: public void rushToPurchase() throws InterruptedException {//获取优惠券数量Integer num = (Integer) redisTemplate.opsForValue().get(“num”);//判断是否抢完if (null == n…