欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

循环优化 问题

程序员文章站 2024-03-14 13:46:16
...

/**
* @(#)TestFor.java
*
*
* @author
* @version 1.00 2009/7/20
*/

public class TestFor {

/**
* Creates a new instance of <code>TestFor</code>.
*/
public TestFor() {
}



/**
* @param args the command line arguments
*/
public static void main(String[] args) {
// TODO code application logic here
Test1(); //219 234 250 187 266
Test2(); //187ms 203 218 110
TestLinkString(); //31ms
TestLinkString2(); //16ms
TestIntMeth(); //3515 3438 2641 3453 3391
TestIntMeth2() ; //3453 3422 3000 2157 3406

TestString1(); //31ms 15
TestString2(); //16ms 15
}




//1 /////////////////////慢
public static void Test1()
{

long ts = System.currentTimeMillis();
// Integer.MAX_VALUE = 2147483647
// Integer.MIN_VALUE
for(int i=0;i<1000;i++){
System.out.println("dd:"+i);
}
long te = System.currentTimeMillis();
System.out.println("时间差1:"+(te-ts));

}

//快
public static void Test2()
{
long ts = System.currentTimeMillis();
for(int i=1000;i>=0;i--){
System.out.println("dd:"+i);
}
long te = System.currentTimeMillis();
System.out.println("时间差2:"+(te-ts));
}
//时间差1:281
//时间差2:235



//22////////////////////////////////TryCatch 放在 for 外面

public static void TestTryCatch()
{
//慢
for(int i=1000;i>=0;i--){
try{

}catch(Exception ex){

}
}
}


public static void TestTryCatch2()
{
try{
//慢
for(int i=1000;i>=0;i--){
System.out.println("dd:"+i);
}
}catch(Exception ex){ }
}

// 一目了然


////333//////////////尽量不要在循环内有多余的方法调用

public static int IntMethod(){
return 10000;
}

public static void TestIntMeth()
{
long ts = System.currentTimeMillis();
for(int i=IntMethod();i>=0;i--){
System.out.println("dd :"+i);
}
long te = System.currentTimeMillis();
System.out.println("时间差TestIntMeth :"+(te-ts));
}
//优化
public static void TestIntMeth2()
{ long ts = System.currentTimeMillis();
int len = IntMethod();
for(int i=len;i>=0;i--){
System.out.println("dd :"+i);
}
long te = System.currentTimeMillis();
System.out.println("时间差TestIntMeth :"+(te-ts));
}




////44///////////////////在循环中最好不要拼接字符串
/*String是不变类,对其更改都会重新创建字符串,从而导致内存和速
度的问题,另外StringBuilder是sun为解决字符串操作效率低下而创建
地(StringBuffer早),有字符buffer,解决字符的增删改都是比较快 */
public static void TestLinkString()
{

String str = "";
long ts = System.currentTimeMillis();
for (int i = 1000; i >=0 ; i--) {
// 慢
str += "慢 ";
}
System.out.println("dd:"+str);
long te = System.currentTimeMillis();
System.out.println("时间差3 LinkString:"+(te-ts));
}

public static void TestLinkString2()
{
long ts = System.currentTimeMillis();
StringBuilder yourString = new StringBuilder();
for (int i = 1000; i >=0 ; i--) {
// 快 占用内存小
yourString.append("快");
}
System.out.println("dd:"+yourString);
long te = System.currentTimeMillis();
System.out.println("时间差4 LinkString:"+(te-ts));
}



////555///////在循环中最好不要拼接字符串2
public static void TestString1()
{
long ts = System.currentTimeMillis();
StringBuilder yourString = new StringBuilder();
for (Integer i = 1000; i >=0 ; i--) {
yourString.append(" " + i);
}
System.out.println("dd:"+yourString);
long te = System.currentTimeMillis();
System.out.println("时间差5 1 String:"+(te-ts));
}
//优化
public static void TestString2()
{ long ts = System.currentTimeMillis();
StringBuilder yourString = new StringBuilder();
for (Integer i = 1000; i >= 0; i--) {
yourString.append(i.toString());
}
System.out.println("dd:"+yourString);
long te = System.currentTimeMillis();
System.out.println("时间差5 2 String:"+(te-ts));
}

}


优化循环体:
循环是比较重复运行的地方,如果循环次数很大,循环体内不好的代码对效率的影响就会被放大而变的突出。
让我们看看下面的代码片:
Vector vect = new Vector(1000);
for( inti=0; i<vect.size(); i++){

}

for循环部分改写成:

int size = vect.size();
for( int i=0; i>size; i++){

}

如果size=1000,就可以减少1000次size()的系统调用开销,避免了循环体重复调用


优化循环体:
再看如下的代码片:
for (int i = 0;i <100000;i++)
if (i%10 == 9) {
// 每十次执行一次
}  
}


改写成也可以提高效率:
for(int i =0,j = 10; i<100000; i++,j--){
 if(j == 0){
  // 每十次执行一次
  j = 10;
 }
}


相关标签: SUN