for循环优化_Java8的forEach效率真的不如for循环吗

前段时间在论坛里看到有同学做过实验,对for循环和forEach循环每个执行一千万次,for循环耗时7.864毫秒,forEach循环耗时23.638毫秒,然后得出结论for循环的性能远远大于forEach循环,我觉得这是不严谨的。

首先JVM的Hot Spot采用JIT技术,它会将运行频率很高的字节码直接编译为机器指令以提高性能;其次JVM执行某一方法或遍历循环的次数越多就会越了解代码结构并作出相应的优化。

JMH 简介

JMH是代码基准测试的工具套件,精度可以达到纳秒级。该工具是Oracle实现JIT的大牛们编写,我相信他们比任何人都了解JIT以及JVM对基准测试的影响。JDK9自带JMH,我的版本是JDK8,需要引入依赖

b8a1fafc7b3cc005cc0781203dcedcc5.png

基准测试类

基准测试类如下,增强的for循环和forEach分别循环一千万次,循环体里面执行3个操作,转小写字母,转大写字母和计算哈希码。

6a82ae7b7fa0365ce5be462430463b7a.png

测试结果

9bd1c0d37bc29c0122782773c4c85037.png

从测试结果可以看出,增强的for循环耗时846.347毫秒,而forEach耗时842.518毫秒,差别不大,甚至forEach要稍微优于增强的for循环。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java中的for循环是一种常见的迭代结构,用于循环执行一段代码块。下面介绍一些优化for循环的方法: 1. 使用增强for循环 增强for循环也称为for-each循环,它可以很方便地遍历数组和集合等数据结构,语法简单,易于理解。与传统的for循环相比,增强for循环可以减少变量声明、循环变量的初始值、循环条件等语句,从而使代码更简洁。 例如,使用增强for循环遍历数组: ``` int[] arr = {1, 2, 3, 4, 5}; for (int i : arr) { System.out.println(i); } ``` 2. 避免重复计算 在for循环中,有些表达式可能需要多次计算,这样会降低程序的性能。为了避免重复计算,可以将表达式的结果存储在局部变量中,并在循环中重复使用。 例如,以下代码中的表达式arr.length会在每次循环中计算一次: ``` for (int i = 0; i < arr.length; i++) { // ... } ``` 可以将arr.length存储在一个局部变量中,以避免重复计算: ``` int len = arr.length; for (int i = 0; i < len; i++) { // ... } ``` 3. 使用前缀递增运算符 在for循环中,使用前缀递增运算符(++i)比后缀递增运算符(i++)更高效,因为前缀递增运算符不需要创建一个临时变量来存储递增前的值。 例如,以下代码使用后缀递增运算符: ``` for (int i = 0; i < arr.length; i++) { // ... } ``` 可以改为使用前缀递增运算符: ``` for (int i = 0; i < arr.length; ++i) { // ... } ``` 4. 使用位运算代替乘除运算 在for循环中,乘法和除法运算可能会比较耗时,可以使用位运算代替乘法和除法运算,从而提高程序的性能。 例如,以下代码使用乘法运算: ``` for (int i = 0; i < arr.length; i++) { int j = i * 2; // ... } ``` 可以改为使用位运算: ``` for (int i = 0; i < arr.length; i++) { int j = i << 1; // ... } ``` 5. 避免使用过多的方法调用 在for循环中,如果调用了过多的方法,会降低程序的性能。为了避免这种情况,可以将方法调用的结果存储在局部变量中,并在循环中重复使用。 例如,以下代码中的方法调用Math.sin()会在每次循环中执行一次: ``` for (double i = 0; i < Math.PI; i += 0.01) { double y = Math.sin(i); // ... } ``` 可以将Math.sin()的结果存储在一个局部变量中,以避免重复调用: ``` for (double i = 0, sinI = Math.sin(i); i < Math.PI; i += 0.01, sinI = Math.sin(i)) { double y = sinI; // ... } ``` 以上就是优化Java for循环的一些方法,可以根据具体情况选择适合的优化方法来提高程序性能。 ### 回答2: Java的for循环是一种常用的循环结构,用于重复执行特定的代码块。一般来说,for循环用于执行已知次数的迭代操作。为了优化for循环的性能,我们可以通过以下几种方式: 1. 减少迭代次数:如果我们已知循环的次数,可以使用确定次数的for循环,避免不必要的迭代。比如,如果我们想要迭代5次,可以使用for(int i=0; i<5; i++)的方式来执行循环。 2. 避免重复计算:在循环中,如果有一些表达式的值在每次迭代时都是不变的,可以将其计算结果保存在一个临时变量中,避免重复计算。这样可以提高循环的执行效率。 3. 使用增强的for循环Java还提供了增强的for循环,也称为foreach循环,适用于遍历数组、集合或其他可迭代对象。与传统的for循环相比,增强的for循环更简洁、易读,并且在性能上并没有明显的劣势。 4. 使用并行循环:如果循环体中的迭代操作是相互独立的,可以考虑将循环改为并行循环Java 8引入了并行流(Parallel Streams)的概念,可以通过使用parallel()方法将顺序流转换为并行流,从而实现循环的并行执行。这种方式适用于具有大量迭代操作和较复杂计算的情况,可以提高程序的性能。 总的来说,优化Java的for循环可以通过减少迭代次数、避免重复计算、使用增强的for循环或并行循环提高性能。根据具体的应用场景和需求,选择适合的优化策略可以使程序更加高效。 ### 回答3: 在Java中,for循环是一种常见的循环结构,用于重复执行一段代码。为了提高for循环的性能和效率,可以采取以下几种优化方法: 1. 减少循环次数:在设计for循环时,可以通过适当选择循环条件来减少循环次数。例如,如果循环次数已知,可以直接在循环条件中指定固定的值,而不是使用动态计算的方法来判断循环的结束条件。 2. 缓存循环变量:在进行多次循环时,可以通过将循环变量的值缓存到一个局部变量中,以减少对循环变量的重复访问。这样可以减少内存访问的开销,并提高循环的执行速度。 3. 使用增强for循环:增强for循环Java中引入的一种简化版的for循环,适用于遍历数组或集合。与传统的for循环相比,增强for循环具有更简洁的语法和更高的执行效率,可以减少循环的代码量和错误的可能性。 4. 避免在循环中进行复杂的操作:在for循环中应尽量避免进行复杂的操作,如方法调用、对象创建等。这些操作会增加循环的执行时间,降低循环的性能。如果需要进行复杂的操作,可以考虑将其提取到循环外部,并使用局部变量来保存计算结果。 5. 合理使用循环变量:在for循环中,可以合理利用循环变量的值来简化逻辑、减少计算量。例如,可以使用循环变量来作为数组或集合的索引,减少对索引的计算;或者使用循环变量来作为某种状态的标志,减少对状态的判断。 总之,优化Java中的for循环需要结合具体的业务场景和性能需求,通过减少循环次数、缓存循环变量、使用增强for循环、避免复杂操作以及合理利用循环变量等方法,可以最大程度地提高for循环的性能和执行效率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值