网站首页 > 精选文章 正文
一、前言
最近会使用到很多的数据处理,其中多出使用了for循环操作,于是思考了一下性能和优化相关的东西,遂有此文...
二、循环的性能排序
在之前的文章中已经对此作了简单的测试,链接:
for循环、增强for循环、foreach、lambda循环哪个效率高
结论:正常循环 > lambda > 增强for循环 > foreach
三、循环中的注意事项
3.1、以小驱大
这个和数据库关联查询是一个道理的,用小表驱动大表的效率是更高的。附代码如下:
/* 外大内小 */
Long start = System.nanoTime();
for (int i = 0;i < 1000; i++) {
for (int j = 0;j < 10; j++ ) {
}
}
Long end = System.nanoTime();
System.out.println("外大内小循环耗时:" + (end - start));
/* 外小内大 */
start = System.nanoTime();
for (int i = 0;i < 10; i++) {
for (int j = 0;j < 1000; j++ ) {
}
}
end = System.nanoTime();
System.out.println("外小内大循环耗时:" + (end - start));
耗时情况如下:
外大内小循环耗时:181410
外小内大循环耗时:93572
3.2、不在循环中做复杂的操作
我们不建议在循环中进行复杂的逻辑操作,这样每一次循环时都增加了性能损耗的,附代码:
Tips:我们参照“以小驱大”的性能基准!
/* 不要在循环中做复杂操作 */
start = System.nanoTime();
for (int i = 0;i < 10; i++) {
for (int j = 0;j < ((10 * 10 * 10) > 100 ? 1000 : 100); j++ ) {
}
}
end = System.nanoTime();
System.out.println("在循环中做了复杂操作耗时:" + (end - start));
耗时情况如下:
在循环中做了复杂操作耗时:94176
3.3、不在循环中做无用操作
这个和上面的情况是有些类似的,我们不建议在循环体中做一些可有可无的操作,如:变量定义、无效输出、无效逻辑运算等。
附代码:
Tips:我们参照“以小驱大”的性能基准!
/* 不要在循环中做无效操作 */
start = System.nanoTime();
for (int i = 0;i < 10; i++) {
for (int j = 0;j < 1000; j++ ) {
Double.valueOf(j);
Long.valueOf(i);
}
}
end = System.nanoTime();
System.out.println("循环中做了无意义操作耗时:" + (end - start));
耗时情况如下:
循环中做了无意义操作耗时:2483294
3.4、不要在循环体重做异常捕获
每一次的循环都做异常处理是比较耗时的,建议放在循环外部进行异常处理。(如果需要多循环分支做异常处理怎么办?)
Tips:我们参照“以小驱大”的性能基准!
/* 不要在循环中异常处理 */
start = System.nanoTime();
for (int i = 0;i < 10; i++) {
for (int j = 0;j < 1000; j++ ) {
try {
int a = i - j;
}catch (Exception e){
e.printStackTrace();
}
}
}
end = System.nanoTime();
System.out.println("循环中做了异常捕获耗时:" + (end - start));
耗时情况:
循环中做了异常捕获耗时:200728
3.5、数据分类处理
如果循环数据能进行分类处理,可以使用关键标识作为Key,然后转成Map进行分类操作处理,必要时可以按照分类开启多线程。
eg:2021年所有员工的业务数据统计。可以做成员工为Key数据为Value的数据进行处理。
3.6、循环中少做外部调用
在循环体中尽量少去做RPC调用、数据库查询等。可以考虑批量操作,比如MP的“saveBatch”、“updateBatchById”等。
3.7、做好前置判断
循环中,如果对属性做检测的,尽量在开始的时候进行,这样可以过滤掉后续的无效逻辑处理。
3.8、删除使用过的数据
如果确认不会对当前的数据做后续操作,可以在数据子项使用后就删除掉,这样可以通过减少数据长度的情况下减少循环操作。
更多精彩,请持续关注:光华技术
猜你喜欢
- 2025-01-31 Java从零开始:不同系统JDK的安装及Java基本命令
- 2025-01-31 Visual Studio 2015 Update 1正式发布
- 2025-01-31 Java中生成随机数的4种方式(java中随机生成数字的方法)
- 2025-01-31 MySQL有哪些实现方式?何为插入,何为更新?
- 2025-01-31 微软:今日起,IE11正式封杀老旧ActiveX控件
- 2025-01-31 阿里Java三面:分布式延时任务方案解析,万字长文一篇点通你
- 2025-01-31 打开软件遇警告 解决方法并不难(软件打开异常是什么原因)
- 2025-01-31 手把手教你搭建一个基于Java的分布式爬虫系统「转」
- 2025-01-31 性能问题从发现到优化一般思路(性能问题是什么意思)
- 2025-01-31 讲真的,关于 Java 正则表达式,你具体知多少?
- 05-3022《Vue 入门教程》VueRouter 路由嵌套
- 05-30前端面试题-Vue 项目中,你做过哪些性能优化?
- 05-30超简 Vue3+elementPlus 后台管理系统
- 05-30还有前端不知道Electron的?手把手教你把Vue项目打包成桌面程序
- 05-30Nuxt最简入门,让vue项目快速被搜索引擎收录
- 05-30Mac上最美最好用软件系列
- 05-30AI编程小白必备|Cursor安装及配置教程
- 05-30好玩儿的编程语言——文言文编程语言
- 最近发表
- 标签列表
-
- 向日葵无法连接服务器 (32)
- git.exe (33)
- vscode更新 (34)
- dev c (33)
- git ignore命令 (32)
- gitlab提交代码步骤 (37)
- java update (36)
- vue debug (34)
- vue blur (32)
- vscode导入vue项目 (33)
- vue chart (32)
- vue cms (32)
- 大雅数据库 (34)
- 技术迭代 (37)
- 同一局域网 (33)
- github拒绝连接 (33)
- vscode php插件 (32)
- vue注释快捷键 (32)
- linux ssr (33)
- 微端服务器 (35)
- 导航猫 (32)
- 获取当前时间年月日 (33)
- stp软件 (33)
- http下载文件 (33)
- linux bt下载 (33)