`

for循环优化

阅读更多

请优化下面代码,并给出原因

for(int i = 0;i<10000;i++) {   
     for(int j = 0;j<1000;j++) {   
          for(int k = 0;k<100;k++) {   
             function(i,j,k);\   
          }   
     }   
   }   

 

-----------------------------------------------------------------------------------------------------------------------------------------

/*
* 0.0.0 ~99.9.0
* 执行次数 100*10*1=1000次
* 执行时间 812
*/
public void doThing(){
for(int i = 0;i<10000;i++) {
     for(int j = 0;j<1000;j++) {
          for(int k = 0;k<100;k++) {
             function(i,j,k);
          }
     }
   }
}

/*
* 0.0.0 ~ 0.9.99
* 执行次数 1*10*100=1000次
* 执行时间 703
*/
public void doOpThing(){
for(int i = 0;i<100;i++) {
     for(int j = 0;j<1000;j++) {
          for(int k = 0;k<10000;k++) {
             function(i,j,k);
          }
     }
   }
}

/*
* 0.0.0 ~ 0.9.99
* 执行次数 1*10*100=1000次
* 执行时间 703
*/
public void doOp2Thing(){
int i,j,k;
for(i = 0;i<100;i++) {
     for(j = 0;j<1000;j++) {
          for(k = 0;k<10000;k++) {
             function(i,j,k);
          }
     }
   }
}

 

其实这道题的目的并不是让你写出优化的方法,而是考你JVM的编译解析原理.
/ Method descriptor #6 ()V
  // Stack: 4, Locals: 4
  public void doThing();
     0  iconst_0             --将int型0推送至栈顶
     1  istore_1 [i]           --将栈顶int型数值存入第二个本地变量
     2  goto 44              --无条件转移
     5  iconst_0             --将int型0推送至栈顶
     6  istore_2 [j]           --将栈顶int型数值存入第三个本地变量
     7  goto 34              --无条件转移
    10  iconst_0             --将int型0推送至栈顶
    11  istore_3 [k]          --将栈顶int型数值存入第四个本地变量
    12  goto 25             --无条件转移
    15  aload_0 [this]        --将第一个引用类型本地变量推送至栈顶
    16  iload_1 [i]            --将第二个int型本地变量推送至栈顶
    17  iload_2 [j]            --将栈顶int型数值存入第三个本地变量
    18  iload_3 [k]            --将栈顶int型数值存入第四个本地变量
    19  invokevirtual org.yclframework.auth.test.dao.ibatis.Optimize.function(int, int, int) : void [24] –执行方法
[以上执行过程都是一致的,两个方法]
    22  iinc 3 1 [k]    --将指定int型变量增加指定值,这里是++
    25  iload_3 [k]    --将第四个int型本地变量推送至栈顶
    26  bipush 100    --将单字节的常量值(-128~127)推送至栈顶
    28  if_icmplt 15   --比较栈顶两int型数值大小,当结果小于0时跳转
    31  iinc 2 1 [j]    --将指定int型变量增加指定值,这里是++
    34  iload_2 [j]    --将栈顶int型数值存入第三个本地变量
    35  sipush 1000   --将一个短整型常量值(-32768~32767)推送至栈顶
    38  if_icmplt 10   --比较栈顶两int型数值大小,当结果小于0时跳转
    41  iinc 1 1 [i]    --将指定int型变量增加指定值,这里是++
    44  iload_1 [i]    --将栈顶int型数值存入第二个本地变量
    45  sipush 10000  --将一个短整型常量值(-32768~32767)推送至栈顶
    48  if_icmplt 5    --比较栈顶两int型数值大小,当结果小于0时跳转
    51  return        --方法返回
      Line numbers:
        [pc: 0, line: 17]
        [pc: 5, line: 18]
        [pc: 10, line: 19]
        [pc: 15, line: 20]
        [pc: 22, line: 19]
        [pc: 31, line: 18]
        [pc: 41, line: 17]
        [pc: 51, line: 24]
      Local variable table:
        [pc: 0, pc: 52] local: this index: 0 type: org.yclframework.auth.test.dao.ibatis.Optimize
        [pc: 2, pc: 51] local: i index: 1 type: int
        [pc: 7, pc: 41] local: j index: 2 type: int
        [pc: 12, pc: 31] local: k index: 3 type: int
编译成Calss的doThing(),其与doOpThing()唯一不同的是执行顺序,其执行顺序如下:
    22  iinc 3 1 [k]
    25  iload_3 [k]
    26  sipush 10000
    29  if_icmplt 15
    32  iinc 2 1 [j]
    35  iload_2 [j]
    36  sipush 1000
    39  if_icmplt 10
    42  iinc 1 1 [i]
    45  iload_1 [i]
    46  bipush 100
    48  if_icmplt 5
    51  return
doOpThing()与doOp2Thing()的执行顺序一模一样.


在出入栈操作中,doThing出入栈如下:
变量    出入栈次数 /比较次数
K        100*1000*10000
J        1000*10000
I        10000
在出入栈操作中,doOpThing的出入栈如下:
变量    出入栈次数 /比较次数
K       10000*1000*100
J        1000*100
I        100


其实For循环里面使用的都是局部变量,其变量采用的是本地变量,只初始化一次
接下来都是出入栈和比较的操作,大家可以看到出入栈和比较次数都是相当快的.
采用优化策略却在时间上却提升了10%,虽然是毫妙级别的

但是如果function是一个执行时间很长的程序,那么程序的提升将会很大.

分享到:
评论

相关推荐

    多重For循环 优化

    ### 多重For循环优化分析 #### 原始代码分析 原始代码示例如下: ```java for(int i = 0; i ; i++) { for(int j = 0; j ; j++) { for(int k = 0; k ; k++) { log(i * j * k); } } } ``` 此段代码中的嵌套循环...

    C++ For循环优化版

    C++循环冒泡法优化 在看到for循环冒泡排序(c++) 后 再次优化了一下,它的程序不能运行,我运行优化的成功了,对初学者理解有很大帮助(还有注释)

    python for循环优化

    本文以一个实际案例出发,探讨如何优化Python的for循环以提高程序效率。 一、问题背景 在项目初期,由于用户数量较少,使用了两层嵌套的for循环来完成计算任务,耗时1-2小时。然而,随着用户基数的增长,项目运行...

    js,java提高编程效率之【for循环优化】.pdf

    本文主要讨论了如何优化JavaScript和Java中的for循环,以提高编程效率。 首先,我们来回顾一下传统的for循环语法: ```javascript for(var i = 0; i ; i++) { // 对arrays[i]进行处理 } ``` 这段代码适用于遍...

    性能测试_性能测试_c#循环优化_

    例如,一个简单的for循环优化前后的对比可能是这样的: ```csharp // 未优化的for循环 for (int i = 0; i ; i++) { // 执行某个操作 } // 优化后的并行for循环 Parallel.For(0, 1000000, i =&gt; { // 执行相同的...

    Java for循环性能优化实现解析

    1. 嵌套循环优化 在Java中,嵌套循环是一种常见的循环结构。但是,如果我们不合理地使用嵌套循环,可能会给程序的性能带来很大的影响。解决方法是遵循“外小内大”的原则,即将小循环放在大循环的内部。这可以显著...

    Codesys V3510 For循环案例分享

    同时,还可以了解如何调试和优化For循环,以提高程序效率。 总的来说,对于工业自动化的新手来说,熟练掌握Codesys V3 3510中的For循环是提升编程能力的关键一步。通过深入学习和实践这些案例,不仅可以提高编程...

    Java for循环Map集合优化实现解析

    "Java for循环Map集合优化实现解析" Java for循环Map集合优化实现解析是Java编程语言中的一种高效的集合优化技术。该技术通过使用Map集合来优化for循环的性能,减少循环次数,从而提高程序的执行效率。 Java for...

    深入探究JavaScript中for循环的效率问题及相关优化

    然而,传统的for循环在处理复杂逻辑或大数据集合时可能会影响脚本的执行效率,优化循环的效率对于提高代码性能至关重要。 首先,传统的for循环的效率问题主要体现在两个方面:一是循环体内部代码的执行时间;二是...

    Vivado HLS 视频课程总结

    18 for循环优化-嵌套的for循环优化 54 18.1 循环嵌套类型 54 18.2 Perfect loop nest示例 55 18.3 Imperfect loop nest示例 56 19 for循环优化-其他优化方法 59 19.1 for循环的并行性 59 19.2 for循环pipeline时的...

    快速学习C语言中for循环语句的基本使用方法

    在C语言中,for循环语句是编程中最常用的循环结构之一,它提供了简洁且灵活的方式来重复执行一段代码。本文将详细介绍C语言中for循环的基本使用方法,并通过一个温度转换程序的例子来阐述其工作原理。 首先,for...

    Javascript-For-Loop-Optimization:Javascript FOR循环优化

    JavaScript循环优化 为什么需要代码优化? 代码优化是用于提高代码质量和效率的一组代码修改方法。 可以对程序进行优化,使其尺寸更小,消耗更少的内存,更快地执行或执行更少的输入/输出操作(来自Google)。 因此...

    编译原理课设for循环

    课设中还提供了"编译课设for循环简单优先三地址.doc"文档,这很可能是详细的项目说明或者报告,包含了算法描述、设计思路、实现细节和可能的优化措施。而"input.txt"则可能包含了一些示例的for循环源代码,用于测试...

    Java代码循环的优化

    下面将详细介绍标题及描述中提到的几个循环优化技巧: 1. **数字比较尽量和0比较** 在Java中,当进行数值比较时,如果可能的话,应尽可能地将其中一个值设置为0来进行比较。这是因为大多数处理器在处理与0的比较...

    FOR循环语句的翻译程序设计(LL(1)法、输出四元式)

    在编程语言的编译原理中,FOR循环语句的翻译是构建编译器的一个关键环节。FOR循环是一种常见的控制流程结构,广泛应用于各种编程语言,用于执行一系列重复操作。本主题将深入探讨如何使用LL(1)分析法来设计翻译程序...

    matlab开发-循环优化方法

    在MATLAB开发中,循环优化是一项关键技能,它旨在提高代码执行效率,减少计算时间,尤其是在处理大数据集或复杂计算时。本主题将深入探讨如何通过优化循环来提升MATLAB程序的性能。以下是对给定文件中可能涉及的几个...

    for循环简单操作 数字的遍历

    `for`循环的优化与注意事项 - 在循环体内避免进行复杂的计算,以免影响性能。 - 如果需要在循环外部使用循环变量,记得在循环外声明。 - 避免在循环体中修改循环变量,可能导致意料之外的结果。 - 使用`break`或`...

    特殊的for循环加法运算

    在探讨“特殊的for循环加法运算”这一主题时,我们首先需要理解其核心概念与应用场景。根据提供的代码片段,我们可以观察到一个典型的Java程序结构,其中包含了一个利用for循环进行特殊加法运算的过程。这段代码旨在...

    循环优化,要充分利用CPU的指令缓存,就要充分分解小的循环。特别是当循环体本身很小的时候,分解循环可以提高性能。

    例如,将for循环中的do_stuff(i)连续调用多次,可以减少比较指令的次数,提升执行速度。但是,如果循环内有中间变量修改,编译器可能不会自动展开,此时需要手动进行。此外,循环展开可能导致代码体积增大,对于有...

    javaEE-嵌套For循环性能优化案例借鉴.pdf

    本文通过一个具体的案例,探讨了如何对嵌套for循环进行性能优化。 案例中的原始代码如下: ```java for (int i = 0; i ; i++) for (int j = 0; j ; j++) for (int k = 0; k ; k++) testFunction(i, j, k); ``` ...

Global site tag (gtag.js) - Google Analytics