循环优化 问题
程序员文章站
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;
}
}
上一篇: spring security xml配置详解(转载)
下一篇: 双向加密