「 代码性能优化 」作为一名Java程序员,你真的会写for循环吗?

简介: 作为一名Java程序员,你真的会写for循环码?完成同样的功能,不同的程序员,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的。当然,这些细节也是体现一名程序员基本功的地方,今天就来说一下java代码优化的事情,今天主要聊一下对于for(while等同理)循环的优化。

前言

作为一名Java程序员,你真的会写for循环码?完成同样的功能,不同的程序员,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的。当然,这些细节也是体现一名程序员基本功的地方,今天就来说一下java代码优化的事情,今天主要聊一下对于for(while等同理)循环的优化。

一、优化嵌套循环

1、不推荐的写法:

startTime=System.nanoTime();
for (inti=0; i<10000000; i++) {
for (intj=0; j<10; j++) {
    }
}
endTime=System.nanoTime();
System.out.println("外大内小耗时:"+ (endTime-startTime));

   

2、推荐的写法:

startTime=System.nanoTime();
for (inti=0; i<10 ; i++) {
for (intj=0; j<10000000; j++) {
    }
}
endTime=System.nanoTime();
System.out.println("外小内大耗时:"+(endTime-startTime));

3、两种写法耗时对比:

外大内小耗时:200192114

外小内大耗时:97995997

由以上对比可知,优化后性能提升了一倍,嵌套循环应该遵循“外小内大”的原则,这就好比你复制很多个小文件和复制几个大文件的区别。

二、提取与循环无关的表达式

1、不推荐的写法:

startTime=System.nanoTime();
for (inti=0; i<10000000; i++) {
i=i*a*b;
}
endTime=System.nanoTime();
System.out.println("未提取耗时:"+(endTime-startTime));

2、推荐的写法:

startTime=System.nanoTime();
c=a*b;
for (inti=0; i<10000000; i++) {
i=i*c;
}
endTime=System.nanoTime();
System.out.println("已提取耗时:"+(endTime-startTime));

3、两种写法耗时对比:

未提取耗时:45973050

已提取耗时:1955

代码中a+b与我们的循环无关,所以应该把它放到外面,避免重复计算,可以看出,优化后性能提升了好几个数量级,这些是不容忽视的。

三、消除循环终止判断时的方法调用

1、不推荐的写法:

startTime=System.nanoTime();
for (inti=0; i<list.size(); i++) {
}
endTime=System.nanoTime();
System.out.println("未优化list耗时:"+(endTime-startTime));

2、推荐的写法:

startTime=System.nanoTime();
intsize=list.size();
for (inti=0; i<size; i++) {
}
endTime=System.nanoTime();
System.out.println("优化list耗时:"+(endTime-startTime));

3、两种写法耗时对比:

未优化list耗时:27375

优化list耗时:2444

list.size()每次循环都会被执行一次,这无疑会影响程序的性能,所以应该将其放到循环外面,用一个变量来代替,优化前后的对比也很明显。

四、注意在循环外层捕获异常

1、不推荐的写法:

startTime=System.nanoTime();
for (inti=0; i<10000000; i++) {
try {
    } catch (Exceptione) {
    }
}
endTime=System.nanoTime();
System.out.println("在内部捕获异常耗时:"+(endTime-startTime));

2、推荐的写法:

startTime=System.nanoTime();
try {
for (inti=0; i<10000000; i++) {
    }
} catch (Exceptione) {
}
endTime=System.nanoTime();
System.out.println("在外部捕获异常耗时:"+(endTime-startTime));

3、两种写法耗时对比:

在内部捕获异常耗时:12150142

在外部捕获异常耗时:1955

总结

作为非常常用的for循环结构,无论是在算法、业务开发、底层框架搭建等等方面,可以让我们非常方便地操作数组、集合和其他一些有规律的事物,但是如果我们在实际开发当中运用不合理,可能会给程序的性能带来很大的负面影响。所谓工欲善其事必先利其器,所以我们还是需要掌握一些技巧来优化我们的代码的。

参考:本篇内容参考自开源社区,感谢前人的经验和付出,让我们可以有机会站在巨人的肩膀上眺望星辰大海。

相关文章
|
4天前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
|
6天前
|
Java 程序员 API
Java循环操作哪个快?
本文探讨了Java中Stream API与传统for循环的性能对比及适用场景。作者通过实际案例分析,指出在某些情况下,过度使用Stream API会导致代码可读性和维护性下降。测试结果显示,在数据量较小的情况下,普通for循环的性能优于Stream API,尤其是在涉及多次类似操作时。因此,建议在开发中根据具体需求选择合适的遍历方式,以提高代码的可读性和性能。
Java循环操作哪个快?
|
18天前
|
XML 安全 Java
Java反射机制:解锁代码的无限可能
Java 反射(Reflection)是Java 的特征之一,它允许程序在运行时动态地访问和操作类的信息,包括类的属性、方法和构造函数。 反射机制能够使程序具备更大的灵活性和扩展性
32 5
Java反射机制:解锁代码的无限可能
|
3天前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
14天前
|
jenkins Java 测试技术
如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例详细说明
本文介绍了如何使用 Jenkins 自动发布 Java 代码,通过一个电商公司后端服务的实际案例,详细说明了从 Jenkins 安装配置到自动构建、测试和部署的全流程。文中还提供了一个 Jenkinsfile 示例,并分享了实践经验,强调了版本控制、自动化测试等关键点的重要性。
47 3
|
15天前
|
分布式计算 Java MaxCompute
ODPS MR节点跑graph连通分量计算代码报错java heap space如何解决
任务启动命令:jar -resources odps-graph-connect-family-2.0-SNAPSHOT.jar -classpath ./odps-graph-connect-family-2.0-SNAPSHOT.jar ConnectFamily 若是设置参数该如何设置
|
14天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
15天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
16天前
|
Java 数据库连接 数据库
Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销
本文深入探讨了Java连接池在数据库性能优化中的重要作用。连接池通过预先创建和管理数据库连接,避免了频繁创建和关闭连接的开销,显著提升了系统的响应速度和吞吐量。文章介绍了连接池的工作原理,并以HikariCP为例,展示了如何在Java应用中使用连接池。通过合理配置和优化,连接池技术能够有效提升应用性能。
32 1
|
算法 安全 Java
Java 性能优化:35个小细节,让你提升Java代码运行的效率
  代码优化,一个很重要的课题。可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了。   代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨;但是如果有足够的时间开发、维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率绝对是有提升的。
247 0