`

Java多层循环优化

    博客分类:
  • JDK
阅读更多
代码如下:
/*
* 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是一个执行时间很长的程序,那么程序的提升将会很大.
分享到:
评论
3 楼 lidong2410 2014-02-21  
不考虑内存的话,一层循环快多了。
2 楼 a123159521 2011-04-01  
freish 写道
“如果function是一个执行时间很长的程序,那么程序的提升将会很大”,这个逻辑,真是不敢恭维,函数的执行时间越长,越体现不出循环“优化”带来的的效果才是

有的时候必须同步执行,业务逻辑控制的,只能顺序执行.
如果可以多线程执行,当然不会用for循环
1 楼 freish 2011-03-19  
“如果function是一个执行时间很长的程序,那么程序的提升将会很大”,这个逻辑,真是不敢恭维,函数的执行时间越长,越体现不出循环“优化”带来的的效果才是

相关推荐

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

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

    多重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); } } } ``` 此段代码中的嵌套循环...

    Java循环技巧大全

    本文将深入探讨Java中的循环技巧,特别是如何利用不同类型的循环控制语句来优化程序性能,提高代码可读性和可维护性。 #### 一、基本循环结构 Java提供了三种基本的循环结构:`for`、`while` 和 `do-while` 循环。...

    7多重循环.zip

    在“7多重循环.zip”这个文件中,我们可以推测它可能包含了一些关于多层循环,即嵌套循环的示例或教程。下面我们将深入探讨多重循环的概念、应用场景以及如何在不同编程语言中实现。 多重循环,顾名思义,是指在...

    01-Java语言基础(语句-For循环嵌套)

    在Java的学习过程中,掌握基础语法是至关重要的,其中“语句”是构成程序的基本单元,而“For循环嵌套”则是Java中一种高效控制流程的方法。 在Java中,For循环是一种预定义结构,常用于迭代执行一段代码块,直到...

    java基础优化编程

    在多重循环中,将最长的循环置于最内层,最短的循环置于最外层,可以减少循环嵌套的复杂度,提高执行效率。 #### 十二、线程安全与集合优化 - **线程安全**:使用`synchronizedList`确保线程安全。 - **预设...

    教学案例六 多重循环.zip

    在编程领域,多重循环是一种常见的控制流结构,用于在程序中执行重复操作。这个"教学案例六 多重循环.zip"文件很可能包含了多个示例,旨在帮助学习者理解和掌握如何在不同的编程语言中使用多重循环。下面我们将深入...

    java代码-java-循环嵌套

    五、循环优化 在编写循环时,应考虑其效率,避免不必要的计算。例如,如果循环体内有相同的操作,可以先计算结果,然后在循环中使用。另外,合理使用集合类(如ArrayList、LinkedList)的迭代器也可以提高效率。 ...

    JAVA程序设计课件-循环嵌套.pptx

    在循环嵌套中,这些循环结构可以相互结合,形成多层循环,每层循环都有自己的控制条件。 嵌套循环的一个经典例子是计算特定范围内数字的特定属性。比如,在描述中提到的案例,计算1到100所有奇数的和,我们可以使用...

    java代码优化

    #### 循环优化 1. **避免在循环中重复计算:** 在循环体内重复计算相同值会降低效率。例如,`for(int i = 0; i (); i++) {}`中,`collection.size()`每次循环都会被调用,造成不必要的计算开销。优化方法是将其结果...

    java 处理Excel 带 List

    除了基本的导出功能,还可以进一步优化Excel的样式,比如设置单元格的字体、颜色、对齐方式,以及合并单元格等。此外,Apache POI还支持模板导出Excel,即预先定义好Excel模板,然后填充数据,这种方式在生成复杂...

    Java面试宝典2011优化版

    4. **跳出多重嵌套循环**:可以使用`break`语句跳出当前的多重嵌套循环,但无法直接跳出外层循环,需配合标签(label)使用。 5. **switch语句的使用**:switch语句可以作用在byte、char、short和int类型上,JDK 7...

    Cobol移植至Java解决方案

    - **性能优化**:虽然Java在某些方面可能不如Cobol效率高,但可以通过优化算法和利用Java的并发特性来提升性能。 - **培训和支持**:团队成员可能需要学习新的编程语言和工具,提供必要的培训和支持至关重要。 总的...

    Java面试宝典2018版

    4. Java中多重循环的跳出: 在Java中,如果需要跳出多重嵌套的循环,可以使用带标签的break语句。在循环体外部定义一个标签,然后在内层循环体中使用break语句后跟这个标签来跳出外层循环。例如,可以定义一个标签...

    java笔记 java笔记

    - **高性能**:虽然Java是一种解释性语言,但其性能优化技术使其接近于编译型语言。 - **简单性**:Java语言设计简洁明了,易于学习和使用。 - **健壮性**:Java拥有严格的错误检测机制,有助于开发健壮的应用程序。...

    循环嵌套案例.rar

    在处理多层逻辑或遍历复杂数据结构时,循环嵌套尤其有用。本案例将探讨如何在不同的编程语言中使用循环嵌套,以及它在实际问题解决中的应用。 一、循环类型与嵌套原理 在编程中,主要存在两种类型的循环:`for`...

    一线互联网大厂完整Java面试题.pdf

    1. Java程序性能优化通常包括减少不必要的对象创建、循环展开、使用局部变量等。 2. 编码规范的遵守有利于提高代码的可读性和可维护性。 Java框架知识点: 1. Spring AOP(面向切面编程)可以将横切关注点与业务...

    2019年最新版修订版Java程序员面试宝典.pdf

    6. 跳出多重嵌套循环的方法:在Java中,可以使用标签(label)配合break语句来跳出多层循环。 7. hashCode的特性:当两个对象通过equals方法比较返回true时,并不意味着它们的hashCode值一定相同,这是由于Java...

    Thinking_in_Java_4th_edition.pdf_java_in_javase_

    1. **Java语言基础**:书中详细讲解了Java的基本语法,包括变量、数据类型、运算符、流程控制(如if语句、for循环、while循环)、函数定义和调用等,这些都是编写任何程序的基础。 2. **面向对象编程**:《Thinking...

Global site tag (gtag.js) - Google Analytics