Java 进阶:异常影响性能吗?

  • Java 进阶异常影响性能吗
    • catch 中不做任何事情
    • catch 中输出异常到日志
    • catch 中获取异常栈
    • 总结

Java 进阶:异常影响性能吗?

曾经在给一个业务系统增加限流功能,使用的限流组件在流量超过阈值时,会直接抛异常,异常导致 CPU 占用率飙升。第一次遇到这样的情况,让我们不得不思考,异常怎么会对性能造成这么大的影响?

下面我们写几个测试程序观察一下。

catch 中不做任何事情

public class ExceptionTest { public static void main(String[] args) { doExTest(); doExTest(); } private static void doExTest() { long start = System.nanoTime(); for (int i=0; i<100000; ++i) { try { throw new RuntimeException("" + Math.random()); } catch (Exception e) { } } System.out.println("time: " + (System.nanoTime() - start)); } }

测试结果如下:

time: 365218274
time: 224583244

第一次 doExTest 只是起到预热的作用,我们以第二次 doExTest 的时间为准。10 万次请求,平均每次请求耗时 2245 纳秒,也就是 0.002 毫秒,速度还是很快的。

catch 中输出异常到日志

public class ExceptionTest { private static final Logger logger = LoggerFactory.getLogger(ExceptionTest.class); public static void main(String[] args) { doExTest(); doExTest(); } private static void doExTest() { long start = System.nanoTime(); for (int i=0; i<100000; ++i) { try { throw new RuntimeException("" + Math.random()); } catch (Exception e) { logger.error("fuck", e); } } System.out.println("time: " + (System.nanoTime() - start)); } }

测试结果如下:

time: 13454674590
time: 9891780450

10 万次请求,平均每次请求耗时 98917 纳秒,大约 0.1 毫秒,比“不输出异常”的时候,慢了 50 倍。输出日志如此耗费性能,那么 logger.error 这一句做了什么事儿呢?
1. 根据过滤规则,判断是否要输出日志
2. 获取异常堆栈
3. 拼接日志字符串,输出日志到文件

获取异常堆栈主要调用的如下方法,下面我们写程序,不输出日志到文件,测试只读取异常栈的性能:

public class Throwable implements Serializable { public StackTraceElement[] getStackTrace() { return getOurStackTrace().clone(); } private synchronized StackTraceElement[] getOurStackTrace() { // Initialize stack trace field with information from // backtrace if this is the first call to this method if (stackTrace == UNASSIGNED_STACK || (stackTrace == null && backtrace != null) /* Out of protocol state */) { int depth = getStackTraceDepth(); stackTrace = new StackTraceElement[depth]; for (int i=0; i < depth; i++) stackTrace[i] = getStackTraceElement(i); } else if (stackTrace == null) { return UNASSIGNED_STACK; } return stackTrace; } }

catch 中获取异常栈

public class ExceptionTest { public static void main(String[] args) { doExTest(); doExTest(); } private static void doExTest() { long start = System.nanoTime(); for (int i=0; i<100000; ++i) { try { throw new RuntimeException("" + Math.random()); } catch (Exception e) { StackTraceElement[] stackTrace = e.getStackTrace(); } } System.out.println("time: " + (System.nanoTime() - start)); } }

测试结果如下:

time: 1559107012
time: 795376775

10 万次请求,平均每次请求耗时 7953 纳秒,大约 0.008 毫秒,比“不输出异常”的时候,慢了 4 倍。这么看获取堆栈耗时并不多,耗时主要在输出日志到文件中。

总结

处理异常的几个步骤里,对性能的耗费从大到小依次为:输出到日志、获取异常堆栈、创建并 catch 异常。

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

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

相关文章

【Qt改变虚拟键盘的大小】

默认情况下qtvirtualkeyboard占据了半个屏幕 可以通过修改源码的方式来修改其大小。 1.找到desktopinputpanel.cpp,参考路径 2.修改show函数注释的代码为源文件原来的代码。 3.键盘样式修改需要修改对应的qml文件&#xff0c;路径为qtvirtualkeyboard/src/virtualkeyboard/cont…

java进阶训练营 极客,关于架构极客大学java进阶训练营

C语言中&#xff0c; 数组[2]属于结构数据类型。一个数组能够合成为多个数组元素&#xff0c;这些数组元素能够是根本数据类型或是构造类型。因而按数组元素的类型不同&#xff0c;数组又可分为数值数组、字符数组、指针数组、构造数组等各种类别。 对于可变长数组(VLA)的问题&…

Java进阶整理

对于一个程序员不能只是停留在满足平常的业务开发的水平&#xff0c;所以今天来整理一下Java的进阶知识。 通过以下几个方面来讲一讲Java的进阶知识&#xff1a; Jvm Jvm结构类加载对象的分配过程 、对象存储布局Java的内存模型、GC&#xff08;MinorGC&#xff08;新生代&a…

java头歌-数组进阶

第一关 public static void main(String[] args) {//动态构建arr1int[] arr1 new int[3];Scanner sc new Scanner(System.in);for(int i 0 ; i< arr1.length ; i){arr1[i] sc.nextInt();}/********** Begin **********///创建数组arr2int[] arr2 new int[3];for (int i…

java进阶知识点

java回收机制 浅谈java中的反射 依赖注入的简单理解 通过接口的引用和构造方法的表达&#xff0c;将一些事情整好了反过来传给需要用到的地方~ 这样做得好处&#xff1a;做到了单一职责&#xff0c;并且提高了复用性&#xff0c;解耦了之后&#xff0c;任你如何实现&#xf…

破解空间困局:看紧凑型ARM工控机如何一机多能

在智能工厂的角落、自动化产线的缝隙、或是移动设备的内部&#xff0c;工程师们常常面临一个经典难题&#xff1a;空间极其有限&#xff0c;但需要连接和控制的设备却一点不少。 摄像头、传感器、PLC、扫码枪、显示屏、机械臂……每一个都需要一个“对话”的接口。传统的工控机…

Java基础进阶-水仙花数

/* 功能&#xff1a;求水仙花数&#xff0c;打印并统计总个数。 思路&#xff1a; 水仙花数是定义范围100-999&#xff0c;满足每个位上的数子的3次方相加和等于这个数 第一步&#xff1a;循环遍历数据范围 第二步&#xff1b;取出当前数字的个位&#xff0c;十位&#xff0c;百…

Java进阶教程(二)代码块

Java进阶教程&#xff08;二&#xff09; 代码块 构造代码块&#xff1a;给所有的对象进行统一的初始化。对象一建立就运行并且优先于构造函数。 静态代码块&#xff1a;随着类的加载而加载。只执行一次&#xff0c;用于给类进行初始化。public class Demo {public static void…

提升Python AI模型训练速度:从入门到进阶的实战优化方案

你在训练AI模型时&#xff0c;最头疼的莫过于“等了几小时甚至几天&#xff0c;模型还没训练完”——不管是图片分类、文本分析还是更复杂的深度学习模型&#xff0c;训练速度直接影响开发效率。 一、硬件层面&#xff1a;先把“基础算力”用到位&#xff08;性价比最高的提速方…

【论文精读】-Graph-Grounded Pre-training and Prompting

家人们&#xff0c;主播又回来啦&#xff0c;这一周主播比较忙&#xff0c;所以就只认认真真精读了这一篇论文。主播这也是第一次使用提问法&#xff0c;讲这篇文章里面究极的一些问题给弄明白了&#xff0c;这也是很好的一点。话不多说&#xff0c;我们来一起看看这篇文章吧&a…

12 种 RAG(检索增强生成)的新型高级架构与方法,建议收藏!

RAG&#xff08;检索增强生成&#xff09; 曾是极其热门的话题之一。而本周非常幸运地看到了一些关于 RAG 的真正令人兴奋的新研究 让我们一起来看看近期出现的 12 种 RAG 高级架构与方法&#xff1a; 1. Mindscape-Aware RAG (MiA-RAG) 全局感知 RAG MiA-RAG 通过首先构建整个…

java学习进阶之路,如果从一个菜鸟进阶成大神

二、下面是java工作之路&#xff0c;以供参考&#xff1a; 三、下面给出阶段性细化需要掌握的技能&#xff1a;1.第一阶段2.第二阶段3.第三阶段4.第四阶段5.第五阶段四、更加细化的细节如下&#xff1a;1&#xff1a; 编程基础 不管是C还是C&#xff0c;不管是Java还是PHP&…

Java_ElasticSearch(ES)——分布式搜索引擎

介绍&#xff1a; Elasticsearch是一个开源的分布式搜索和分析引擎&#xff0c;最初由Elastic公司开发。它构建在Apache Lucene搜索引擎库之上&#xff0c;提供了一个强大的全文搜索和分析引擎&#xff0c;它结合kibana、Logstash、Beats&#xff0c;是一整套技术栈&#xff0…

手写一个单例模式 (考虑线程安全)。

手写一个单例模式 (考虑线程安全) 关键词:单例模式, 线程安全, 设计模式, 双重检查锁定, 并发编程, 懒汉式, 饿汉式 摘要:单例模式是软件开发中最基础也最常用的设计模式之一,它保证一个类在整个系统中只有一个实例,并提供全局访问点。然而在多线程环境下,简单的单例实现可…

一个在使用方法上的低级错误(MySQL场景)

首先申明这个技术含量不高初始化问题数据。注意这里的t代表时间&#xff0c;数据类型是字符串。为什么用字符串来表示时间&#xff1f;那这就是问题所在。当初创建的人不懂。这个回答不知道满意吗&#xff1f;mysql> create table t1 (id int,t varchar(20)); Query OK, 0 r…

深度学习毕设选题推荐:基于python的CNN训练识别吃的美食基于深度学习的CNN训练识别吃的美食

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

深度学习毕设项目推荐-深度学习基于python的CNN训练识别吃的美食基于python的深度学习CNN训练识别吃的美食

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

救命神器!9个AI论文网站测评:本科生毕业论文全攻略

救命神器&#xff01;9个AI论文网站测评&#xff1a;本科生毕业论文全攻略 学术写作新选择&#xff1a;AI论文网站测评全解析 在当前高校教育日益重视科研能力的背景下&#xff0c;本科生在撰写毕业论文时面临诸多挑战&#xff0c;如选题困难、资料查找繁琐、格式规范不熟悉等。…

ReadView的结构和工作原理?

你想深入掌握 Read View 的结构和工作原理&#xff0c;这是理解 MVCC 快照读的核心 ——Read View 就像 MVCC 的 “版本安检员”&#xff0c;决定了当前事务能看到版本链中的哪个版本。接下来我会先拆解 Read View 的核心结构&#xff0c;再用通俗的逻辑 实例讲清它的工作原理…

Java 进阶:如何让线程主动让出 CPU

Java 进阶如何让线程主动让出 CPU ThreadsleepThreadyieldThreadcurrentThreadsuspendObjectwaitLockSupportparkThreadstop Java 进阶&#xff1a;如何让线程主动让出 CPU Thread.sleep sleep 方法可以让线程主动让出 CPU&#xff0c;但是并不会释放锁。 /*** Causes the …