JAVA中for循环优化的思考

一、前言

最近会使用到很多的数据处理,其中多出使用了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、删除使用过的数据

如果确认不会对当前的数据做后续操作,可以在数据子项使用后就删除掉,这样可以通过减少数据长度的情况下减少循环操作。

更多精彩,请持续关注:光华技术

相关文章

用了那么久的 Java For 循环,你知道哪种方式效率最高吗?

作为程序员每天除了写很多 if else 之外,写的最多的也包含 for 循环了,都知道我们 Java 中常用的 for 循环有两种方式,一种是使用 for loop,另一种是使用 foreach,那...

java里的for循环

从字节码角度再来分析一下,java里的for循环是怎么做到的。既然是字节码角度,那一定是在操作栈和局部变量表来实现的。先看一下源代码:很简单的一个代码,循环10次,每次循环打印输出i。我们再使用jav...

Java中的while循环:掌握基础,提升编程效率

在Java编程中,循环结构是控制程序流程的重要工具之一。其中,while循环因其简洁和灵活性,被广泛应用于各种场景。本文将深入探讨while循环的使用方法、常见问题以及优化技巧,帮助你更好地掌握这一基...

Java循环:for、foreach与stream性能对比

性能比较如果数据在1万以内的话,for循环效率高于foreach和stream;如果数据量在10万的时候,stream效率最高,其次是foreach,最后是for。另外需要注意的是如果数据达到100万...

Java里的for循环怎么用

前言在前面的文章中,壹哥给大家讲解了顺序结构、分支结构,接下来我们就来学习Java里的循环结构。Java里的循环结构,可以通过while、do-while、for、foreach等方式进行实现,今天壹...