论坛首页 Java企业应用论坛

循环的优化

浏览 13593 次
锁定老帖子 主题:循环的优化
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-29  
BenoWay 写道

是不是我写的测试有问题呀。


你写的测试代码非常好,

不好的是,

for(int i=Integer.MAX_VALUE;i>=0;i--)

你少了一个等号,

我使用你的测试代码测试结果如下
开始测试for循环
5015
4767
开始测试for循环
5007
4829
开始测试for循环
4995
4794
开始测试for循环
4991
4786
开始测试for循环
4990
4920
开始测试for循环
4994
4786
开始测试for循环
5016
4759
开始测试for循环
4991
4882
开始测试for循环
4998
4802
开始测试for循环
0 请登录后投票
   发表时间:2008-10-29  
有了瓶颈了或者可以预测到瓶颈了才去优化它。
0 请登录后投票
   发表时间:2008-10-30  
如果是一个系统需要立即优化性能,马上投入生产环境,当然是抓主要的东西去优化。
但是平时编程,应该从细节去做到优化。否则平时积累的多了,整体影响会很大的。
0 请登录后投票
   发表时间:2008-10-30  
for(int i=0;i<Integer.MAX_VALUE;i++){  
     //慢  
}  
//优化  
for(int i=Integer.MAX_VALUE;i>=0;i--){  
     //快  
}  
这个循环次数一样吗?
0 请登录后投票
   发表时间:2008-10-30  
public static void main(String[] args) {
for (int i = 0; i < 20; i++) {
compare();
}
}
static void compare(){
final int MAX = 10000000;
long start = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
}
System.out.println("end == " + (System.currentTimeMillis() - start));
long start1 = System.currentTimeMillis();
for (int k = MAX; k > 0; k--) {
}
System.out.println("end == " + (System.currentTimeMillis() - start1));
System.out.println("====================================");
}

结果:
end == 47
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 15
end == 32
====================================
end == 15
end == 32
====================================
end == 15
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
end == 31
end == 16
====================================
end == 31
end == 16
====================================
end == 31
end == 16
====================================
end == 31
end == 15
====================================
end == 32
end == 15
====================================
end == 32
end == 31
====================================
end == 15
end == 32
====================================
end == 15
end == 32
====================================
end == 15
end == 31
====================================
end == 16
end == 31
====================================
end == 16
end == 31
====================================
0 请登录后投票
   发表时间:2008-10-30  
BenoWay 写道
for(int i=0;i<Integer.MAX_VALUE;i++){  
     //慢  
}  
//优化  
for(int i=Integer.MAX_VALUE;i>=0;i--){  
     //快  
}  
这个循环次数一样吗?

下面多了一次循环。
0 请登录后投票
   发表时间:2008-10-31  
sunflowers 写道
lyy5271 写道

我觉得这些东西可以扩展知识面,但用处不大。举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。


不敢苟同!如果仅仅是类似我文章类似1的优化,你的观点是正确的,

但是对于类似很多以下几个的优化,你的观点确实应该值得每一个认为无所为的程序员深思。

我们是写程序的,写出优秀的代码应该是我们共同的目标,不应当因系统的规模大小和难易程

度而改变我们的追求。当你看别人程序的时候,一个有很多年java开发经验的时候,你也许会

发现类似这样的拙劣:var.equals("123");,也许这样写是小事,可是我觉得这样写对于初学者

是可以原谅的……。回过头来看345,如果是企业应用,你的代码也许正在严重影响性能

一句话总结:无论你写的是什么样系统,都应该把你最好的代码写进去。


var.equals("123");这个有什么问题?
0 请登录后投票
   发表时间:2008-10-31  
jieping310 写道

var.equals("123");这个有什么问题?

var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null

所以字符串比较时,标准的写法应该是"123".equals(var);
0 请登录后投票
   发表时间:2008-10-31  
sunflowers 写道
jieping310 写道

var.equals("123");这个有什么问题?

var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null

所以字符串比较时,标准的写法应该是"123".equals(var);


这个学到了:)。。
0 请登录后投票
   发表时间:2008-10-31  
sunflowers 写道
jieping310 写道

var.equals("123");这个有什么问题?

var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null

所以字符串比较时,标准的写法应该是"123".equals(var);


我只要先做个判断就可以啊
var != null && var.equals("123")这样跟 "123".equals(var);性能上有很大区别么?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics