请优化下面代码,并给出原因
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循环优化分析 #### 原始代码分析 原始代码示例如下: ```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++) 后 再次优化了一下,它的程序不能运行,我运行优化的成功了,对初学者理解有很大帮助(还有注释)
本文以一个实际案例出发,探讨如何优化Python的for循环以提高程序效率。 一、问题背景 在项目初期,由于用户数量较少,使用了两层嵌套的for循环来完成计算任务,耗时1-2小时。然而,随着用户基数的增长,项目运行...
本文主要讨论了如何优化JavaScript和Java中的for循环,以提高编程效率。 首先,我们来回顾一下传统的for循环语法: ```javascript for(var i = 0; i ; i++) { // 对arrays[i]进行处理 } ``` 这段代码适用于遍...
例如,一个简单的for循环优化前后的对比可能是这样的: ```csharp // 未优化的for循环 for (int i = 0; i ; i++) { // 执行某个操作 } // 优化后的并行for循环 Parallel.For(0, 1000000, i => { // 执行相同的...
1. 嵌套循环优化 在Java中,嵌套循环是一种常见的循环结构。但是,如果我们不合理地使用嵌套循环,可能会给程序的性能带来很大的影响。解决方法是遵循“外小内大”的原则,即将小循环放在大循环的内部。这可以显著...
同时,还可以了解如何调试和优化For循环,以提高程序效率。 总的来说,对于工业自动化的新手来说,熟练掌握Codesys V3 3510中的For循环是提升编程能力的关键一步。通过深入学习和实践这些案例,不仅可以提高编程...
"Java for循环Map集合优化实现解析" Java for循环Map集合优化实现解析是Java编程语言中的一种高效的集合优化技术。该技术通过使用Map集合来优化for循环的性能,减少循环次数,从而提高程序的执行效率。 Java for...
然而,传统的for循环在处理复杂逻辑或大数据集合时可能会影响脚本的执行效率,优化循环的效率对于提高代码性能至关重要。 首先,传统的for循环的效率问题主要体现在两个方面:一是循环体内部代码的执行时间;二是...
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循环的基本使用方法,并通过一个温度转换程序的例子来阐述其工作原理。 首先,for...
JavaScript循环优化 为什么需要代码优化? 代码优化是用于提高代码质量和效率的一组代码修改方法。 可以对程序进行优化,使其尺寸更小,消耗更少的内存,更快地执行或执行更少的输入/输出操作(来自Google)。 因此...
课设中还提供了"编译课设for循环简单优先三地址.doc"文档,这很可能是详细的项目说明或者报告,包含了算法描述、设计思路、实现细节和可能的优化措施。而"input.txt"则可能包含了一些示例的for循环源代码,用于测试...
下面将详细介绍标题及描述中提到的几个循环优化技巧: 1. **数字比较尽量和0比较** 在Java中,当进行数值比较时,如果可能的话,应尽可能地将其中一个值设置为0来进行比较。这是因为大多数处理器在处理与0的比较...
在编程语言的编译原理中,FOR循环语句的翻译是构建编译器的一个关键环节。FOR循环是一种常见的控制流程结构,广泛应用于各种编程语言,用于执行一系列重复操作。本主题将深入探讨如何使用LL(1)分析法来设计翻译程序...
在MATLAB开发中,循环优化是一项关键技能,它旨在提高代码执行效率,减少计算时间,尤其是在处理大数据集或复杂计算时。本主题将深入探讨如何通过优化循环来提升MATLAB程序的性能。以下是对给定文件中可能涉及的几个...
`for`循环的优化与注意事项 - 在循环体内避免进行复杂的计算,以免影响性能。 - 如果需要在循环外部使用循环变量,记得在循环外声明。 - 避免在循环体中修改循环变量,可能导致意料之外的结果。 - 使用`break`或`...
在探讨“特殊的for循环加法运算”这一主题时,我们首先需要理解其核心概念与应用场景。根据提供的代码片段,我们可以观察到一个典型的Java程序结构,其中包含了一个利用for循环进行特殊加法运算的过程。这段代码旨在...
例如,将for循环中的do_stuff(i)连续调用多次,可以减少比较指令的次数,提升执行速度。但是,如果循环内有中间变量修改,编译器可能不会自动展开,此时需要手动进行。此外,循环展开可能导致代码体积增大,对于有...
本文通过一个具体的案例,探讨了如何对嵌套for循环进行性能优化。 案例中的原始代码如下: ```java for (int i = 0; i ; i++) for (int j = 0; j ; j++) for (int k = 0; k ; k++) testFunction(i, j, k); ``` ...