Java for循环优化

小姜哥
博客专家认证
2010-12-01 08:31:00
for(int i = 0 ; i < 1000 ;i++){
for(int j = 0; i < 100; j++){
for(int k = 0;k < 10; k++ ){
fun(i,j,k);
}
}
}
今天笔试的时候遇到这么一道题目 说有上面这么循环嵌套 ,问怎么优化 并说明原因。
...全文
758 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
arsenal1999 2010-12-11
  • 打赏
  • 举报
回复
牛叉 学到了!
龙四 2010-12-11
  • 打赏
  • 举报
回复
去试试IBM J9 1.5和IBM J9 1.6,两者跑出的结果大相径庭,甚至让你瞠目结舌

[Quote=引用 40 楼 schh0313 的回复:]

没办法,Sun公司已经很牛了,虽然被Oracle收购了。
就是.net来讲没有JVM
还是会有初始化变量时的占用内存-->释放内存的重复操作。
[/Quote]
逍遥K杰 2010-12-11
  • 打赏
  • 举报
回复
真实受益匪浅,一个很简单的问题在大的项目里面就可以看出差别了
sk811229 2010-12-11
  • 打赏
  • 举报
回复
呵呵 我来给大家换个思路,

这三个循环嵌套其实根本没有意义啊

它要表示的无非就是三个变量之间的关系而已

我们何不直接一点呢?

这样写:

k=10
i=1000
j=100
fun(i,j,k)

当然如果从算法的角度应该是如何降低 时/空复杂度 没仔细看 就不写了
juy23liu 2010-12-11
  • 打赏
  • 举报
回复
真是感触颇深。本人还是一个初学者。关于两楼说的
k <10;k++; 执行10次
j <100;j++ 执行10*100次
i <1000;i++ 执行10*100*1000次
function(i,j,k); 执行10*100*1000次
共执行语句数=(10+10*100+10*100*1000)*2+10*100*1000=3002020
一共执行语句数,不太明白!
内大外小和内小外大,最终如果输入的次数应该是一样的吧,一共都是10*100*1000次?而您所说的共执行语句次数不太明白。大虾,请详细说明一下。谢谢啦!
lynn_chen 2010-12-11
  • 打赏
  • 举报
回复
弱弱的问一下:

=(10+10*100+10*100*1000)*2
为什么要*2??
常胖说 2010-12-10
  • 打赏
  • 举报
回复
没办法,Sun公司已经很牛了,虽然被Oracle收购了。
就是.net来讲没有JVM
还是会有初始化变量时的占用内存-->释放内存的重复操作。
龙四 2010-12-10
  • 打赏
  • 举报
回复
这种jvm实现太垃圾了吧,离开了作用域的j、k在下一次循环中可以重用嘛,为什么要丢弃还不断的分配?重用,这才是一个好的jvm应该做的!


[Quote=引用 38 楼 schh0313 的回复:]

内小外大:
k初始化100*1000次
j初始化1000次
内大外小:
k初始化10*100
j初始化10次
很明显内大外小更好一些,在JAVA中所有的赋值语句、比较语句、++语句这些都会转换成进栈、出栈、比较、加等各种指令。
也就是说内小外大比内大外小多执行很多JVM指令(因为一个简单的int i,int j之类的变量声明,编译成JVM指令后,可不只是一条指令)。
以上代码可以……
[/Quote]
常胖说 2010-12-10
  • 打赏
  • 举报
回复
内小外大:
k初始化100*1000次
j初始化1000次
内大外小:
k初始化10*100
j初始化10次
很明显内大外小更好一些,在JAVA中所有的赋值语句、比较语句、++语句这些都会转换成进栈、出栈、比较、加等各种指令。
也就是说内小外大内大外小多执行很多JVM指令(因为一个简单的int i,int j之类的变量声明,编译成JVM指令后,可不只是一条指令)。
以上代码可以优化成:

int i=0;
int j=0;
int k=0;
for(i=0;i<10;i++){
for(j=0;j<100;j++){
for(k=0;k<1000;k++){
fun(i,j,k);
}
}
}

fun()被调用的次数虽然相同,但不意味着程序的效率相同。发现问题,要多思考
lxningasjj 2010-12-07
  • 打赏
  • 举报
回复
来学习
Hallelujah_chen 2010-12-07
  • 打赏
  • 举报
回复
个人认为 fro循环内大外小 在内存信息块的切换上的次数就相对减少,所以效率应该会更高些。
whut_lcy 2010-12-07
  • 打赏
  • 举报
回复
看过C的一篇文章,这两种代码都要计较:
代码1:
for(int i = 0; i < 5000;i++){

if(a>10){
//
}
else{

}
}

代码2:
if(a>10){
for(int i = 0; i < 5000;i++){

}
}
else{
for(int i = 0; i < 5000;i++){

}
}
whut_lcy 2010-12-07
  • 打赏
  • 举报
回复
18L说的没错。

C语言中循环的嵌套,确实很影响系统性能。毕竟C语言写的东西都是系统级别或者嵌入式级别的程序,一点点的差异可能带来的最终影响非常大。java的范畴基本是应用程序层次,时间的关键度不是特别明显,但还是有的。

该题目的核心,也就是要考察一下程序执行效率问题。最忙的循环要放在最里层去做,这样尽量减少CPU指令和调用栈的切换,以最大化CPU指令的流水线操作

码道功臣 2010-12-07
  • 打赏
  • 举报
回复
不好意思,我错了,2楼有算的正确
码道功臣 2010-12-07
  • 打赏
  • 举报
回复
2楼误导

public class Test1 {

/**
* @param args
*/
public static void main(String[] args) {
int x = 0;
int y = 0;
for (int k = 0; k < 10; k++) {
for (int j = 0; j < 100; j++) {
for (int i = 0; i < 1000; i++) {
++x;
}
}
}

for (int k = 0; k < 1000; k++) {
for (int j = 0; j < 100; j++) {
for (int i = 0; i < 10; i++) {
++y;
}
}
}
System.out.println("x=" + x);
System.out.println("y=" + y);

}
}

x=1000000
y=1000000
码道功臣 2010-12-07
  • 打赏
  • 举报
回复
支持5楼,根本的东西没有抓住!fun调用次数不能变。
ishisy 2010-12-07
  • 打赏
  • 举报
回复
很不错的
sp900409 2010-12-02
  • 打赏
  • 举报
回复
学习了,内大外小不错~~~嘿嘿!
TKD03072010 2010-12-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 mythofking 的回复:]

下面内容是从另外一个帖子上看到的
分析:
内大外小
for( int k=0;k <10;k++){
for(int j=0;j <100;j++){
for(int i=0;i <1000;i++){
function(i,j,k);
}
}
} ……
[/Quote]
学习了
ssi321 2010-12-02
  • 打赏
  • 举报
回复
很好!过来看看
加载更多回复(22)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧