锁定老帖子 主题:循环的优化
精华帖 (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循环 |
|
返回顶楼 | |
发表时间:2008-10-29
有了瓶颈了或者可以预测到瓶颈了才去优化它。
|
|
返回顶楼 | |
发表时间:2008-10-30
如果是一个系统需要立即优化性能,马上投入生产环境,当然是抓主要的东西去优化。
但是平时编程,应该从细节去做到优化。否则平时积累的多了,整体影响会很大的。 |
|
返回顶楼 | |
发表时间:2008-10-30
for(int i=0;i<Integer.MAX_VALUE;i++){
//慢 } //优化 for(int i=Integer.MAX_VALUE;i>=0;i--){ //快 } 这个循环次数一样吗? |
|
返回顶楼 | |
发表时间: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 ==================================== |
|
返回顶楼 | |
发表时间:2008-10-30
BenoWay 写道 for(int i=0;i<Integer.MAX_VALUE;i++){
//慢 } //优化 for(int i=Integer.MAX_VALUE;i>=0;i--){ //快 } 这个循环次数一样吗? 下面多了一次循环。 |
|
返回顶楼 | |
发表时间:2008-10-31
sunflowers 写道 lyy5271 写道 我觉得这些东西可以扩展知识面,但用处不大。举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。 不敢苟同!如果仅仅是类似我文章类似1的优化,你的观点是正确的, 但是对于类似很多以下几个的优化,你的观点确实应该值得每一个认为无所为的程序员深思。 我们是写程序的,写出优秀的代码应该是我们共同的目标,不应当因系统的规模大小和难易程 度而改变我们的追求。当你看别人程序的时候,一个有很多年java开发经验的时候,你也许会 发现类似这样的拙劣:var.equals("123");,也许这样写是小事,可是我觉得这样写对于初学者 是可以原谅的……。回过头来看345,如果是企业应用,你的代码也许正在严重影响性能 一句话总结:无论你写的是什么样系统,都应该把你最好的代码写进去。 var.equals("123");这个有什么问题? |
|
返回顶楼 | |
发表时间:2008-10-31
jieping310 写道 var.equals("123");这个有什么问题? var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null 所以字符串比较时,标准的写法应该是"123".equals(var); |
|
返回顶楼 | |
发表时间:2008-10-31
sunflowers 写道 jieping310 写道 var.equals("123");这个有什么问题? var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null 所以字符串比较时,标准的写法应该是"123".equals(var); 这个学到了:)。。 |
|
返回顶楼 | |
发表时间:2008-10-31
sunflowers 写道 jieping310 写道 var.equals("123");这个有什么问题? var是个变量,变量就有可能为null,而"123"是个常量,永远都不可能给为null 所以字符串比较时,标准的写法应该是"123".equals(var); 我只要先做个判断就可以啊 var != null && var.equals("123")这样跟 "123".equals(var);性能上有很大区别么? |
|
返回顶楼 | |