论坛首页 Java企业应用论坛

循环的优化

浏览 13594 次
锁定老帖子 主题:循环的优化
精华帖 (2) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-10-28  
lyy5271 写道
我觉得这些东西可以扩展知识面,但用处不大。
举个例子,访问二维数组的时候按行优先比按列优先效率要高,原因是所谓的局部性原理,可以充分利用计算机的高速缓存,可是这些东西对做java的企业应用有什么用处呢?反正我觉得没有什么用处。


当数据量大到一定程度时你就知道有不有用了。
0 请登录后投票
   发表时间:2008-10-28  
引用

2,尽量把异常捕获写在外面  
//foo  
for(int i=180000;i>=0;i--){  
try{  
//慢  
}catch{  
}  
}  
 
//优化  
try{  
for(int i=180000;i>=0;i--){  
//快  
 
}  
}catch{  
}  


这两个表示的意义都不一样
0 请登录后投票
   发表时间:2008-10-28  
第一例子我觉得到差别不大,其他的是应该这样写,还有个那个异常处理也有问题,因为产生的结果不一样,那得根据业务需要了!平时编码时还是时要注意优化和美观!
0 请登录后投票
   发表时间:2008-10-28  
恩,楼主总结的非常好。
我们的编码规范也是这么要求的
0 请登录后投票
   发表时间:2008-10-29  

/*循环的优化   
---------------------------------------  
1,数字比较尽量和0比较  
注释:计算机喜欢0和1 
//foo  
for(int i=0;i<Integer.MAX_VALUE;i++){  
     //慢  
}  
//优化  
for(int i=Integer.MAX_VALUE;i>=0;i--){  
     //快  
}  
*/


public class TestFor {
private long count = 0;

public TestFor(long count){
System.out.println("开始测试for循环");
this.count = count;
}
//connect string
public String connectBuilder(String str1,String str2,String str3){
StringBuilder builder = new StringBuilder();
return builder.append(str1).
   append(str2).
   append(str3).
   toString();
}
//test from 0;
public void doForBegin0(){
for(long i=0;i<count;i++){
connectBuilder("str1","str2","str3");
}
}

//test from max
public void doForBeginMax(){
for(long i=count;i>0;i--){
connectBuilder("str1","str2","str3");
}
}


public static void main(String args[]){ 

 for(int i=20;i>0;i--){

TestFor test = new TestFor(10000000);
long beginTime = System.currentTimeMillis();
test.doForBegin0();
long endTime = System.currentTimeMillis();
System.out.println(endTime-beginTime);

System.runFinalization();
System.gc();
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}

beginTime = System.currentTimeMillis();
test.doForBeginMax();
endTime = System.currentTimeMillis();
System.out.println(endTime-beginTime); 
}

}
}

/*
测试结果:似乎好像看不太出来。。。。。。。》》》》》》》》》》》》》


开始测试for循环
297
281
开始测试for循环
266
265
开始测试for循环
282
282
开始测试for循环
265
281
开始测试for循环
266
265
开始测试for循环
282
281
开始测试for循环
281
282
开始测试for循环
281
281
开始测试for循环
281
281
开始测试for循环
265
281
开始测试for循环
281
281
开始测试for循环
282
281
开始测试for循环
281
282
开始测试for循环
265
282
开始测试for循环
281
281
开始测试for循环
282
281
开始测试for循环
266
266
开始测试for循环
281
282
开始测试for循环
265
282
开始测试for循环
281
281
*/

 

0 请登录后投票
   发表时间:2008-10-29  
挺是不错的
0 请登录后投票
   发表时间:2008-10-29  
是不是我写的测试有问题呀。
0 请登录后投票
   发表时间:2008-10-29  
在for循环理更令人震惊,结果和楼主刚好相反:

import java.util.concurrent.TimeUnit;

/* 循环的优化   
---------------------------------------  
1,数字比较尽量和0比较  
注释:计算机喜欢0和1 
//foo  
for(int i=0;i<Integer.MAX_VALUE;i++){  
     //慢  
}  
//优化  
for(int i=Integer.MAX_VALUE;i>=0;i--){  
     //快  
}  
测试结论:看不太出来
*/

public class TestFor {

public TestFor(){
System.out.println("开始测试for循环");
}
//test from 0;
public void doForBegin0(){
for(long i=0;i<Integer.MAX_VALUE;i++){
;
}
}

//test from max
public void doForBeginMax(){
for(long i=Integer.MAX_VALUE;i>0;i--){
;
}
}


public static void main(String args[]){
for(int i=20;i>0;i--){
TestFor test = new TestFor();

long beginTime = System.currentTimeMillis();
test.doForBegin0();
long endTime = System.currentTimeMillis();
System.out.println(endTime-beginTime);

//System.runFinalization();
System.gc();
try {
TimeUnit.MILLISECONDS.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}

beginTime = System.currentTimeMillis();
test.doForBeginMax();
endTime = System.currentTimeMillis();
System.out.println(endTime-beginTime);

}
  }
}

结果:每个都比第一种慢。。。。。》》》》》》》》
开始测试for循环
12531
13735
开始测试for循环
11297
11500
开始测试for循环
11235
11484
开始测试for循环
11250
11516
开始测试for循环
11281
11578
开始测试for循环
11250
11469
开始测试for循环
11203
11500
开始测试for循环
11250
11516
开始测试for循环
11296
11453
开始测试for循环
11235
11484
开始测试for循环
11250
11516
开始测试for循环
11281
11516
开始测试for循环
11281
11516
开始测试for循环
11375
11500
开始测试for循环
11297
11563
开始测试for循环
11312
11578
开始测试for循环
11282
11625
开始测试for循环
11266
11469
开始测试for循环
11640
11813
开始测试for循环
11234
11547

。。。。。
0 请登录后投票
   发表时间:2008-10-29  
4, 在循环中最好不要拼接字符串一 
注释:String是不变类,对其更改都会重新创建字符串,从而导致内存和速 
 
度的问题, 
另外StringBuilder是sun为解决字符串操作效率低下而创建 
地(StringBuffer早), 
有字符buffer,解决字符的增删改都是相当快滴 
//foo 
String str = ""; 
   for (int i = 0; i >= 18000; i--) {    
     // 慢 占用内存大 
     str += "慢 占用内存大"; 

//优化 
StringBuilder yourString = new StringBuilder(); 
for (int i = 0; i >= 18000; i--) {
     // 快 占用内存小 
     yourString.append("快 占用内存小"); 


for (int i = 0; i >= 18000; i--) 改为
for (int i = 18000; i >= 0; i--)
0 请登录后投票
   发表时间:2008-10-29  
这些细节以前还真没注意过呢
0 请登录后投票
论坛首页 Java企业应用版

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