g)>
105 invokevirtual #11 <Method java.lang.String toString()>
108 invokevirtual #12 <Method void println(java.lang.String)>
所以速度加快了。
String 的最佳化
通常我们要处理字符串时,第一个想到的就是String 类别,范例如下:
//StringBufferTest.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class StringBufferTest extends MIDlet
{
public StringBufferTest()
{
}
public void startApp()
{
Runtime rt = Runtime.getRuntime() ;
long diffstart = rt.totalMemory()-rt.freeMemory();
System.out.println("Memory used Start:" + diffstart) ;
//注意,底下的程序代码没有任何意义,纯粹要展示String 有多耗内存
String sum = "" ;
for(int i=0 ; i< 5000 ; i++)
{
sum = sum + "+" + i ;
}
long diffend = rt.totalMemory()-rt.freeMemory();
System.out.println("Memory used End:" + diffend) ;
System.out.println("Memory used after operation:" + (diffend-diffstart)) ;
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
}
J2ME循环与String优化设计(3)
时间:2011-02-10
执行结果:
Memory used Start:28564
Memory used End:259864
Memory used after operation:231300
在此范例程序中,我们使用Runtime 类别的totoalMemory()来取得系统所有的内存大小,使用freeMemory()来取得可用内存的大小,两者相减之后约略是中间程序代码执行时所占用的内存大小。我们可以发现,循环执行500 次,耗掉了约231300 byte 的内存。如果我们把String 用StringBuffer 来替代:
//StringBufferTest.java
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class StringBufferTest extends MIDlet
{
public StringBufferTest()
{
}
public void startApp()
{
Runtime rt = Runtime.getRuntime() ;
long diffstart = rt.totalMemory()-rt.freeMemory();
System.out.println("Memory used Start:" + diffstart) ;
//注意,底下的程序代码没有任何意义,纯粹要展示StringBuffer
StringBuffer sum = new StringBuffer("");
for(int i=0 ; i< 5000 ; i++)
{
sum = sum.append("+").append(i) ;
}
long diffend = rt.totalMemory()-rt.freeMemory();
System.out.println("Memory used End:" + diffend) ;
System.out.println("Memory used after operation:" + (diffend-diffstart)) ;
}
public void pauseApp()
{
}
public void destroyApp(boolean unconditional)
{
}
}
执行结果:
Memory used Start:28548
Memory used End:160848
Memory used after operation:132300
我们发现,改用StringBuffer 之后,循环同样执行500 次,,一样效果的程序代码,但内存只耗掉了132300 byte 的内存。少了将近一倍,这告诉我们,虽然StringBuffer 无法完全取代,但是如果可以的话,尽量使用StringBuffer。
之所以有节省内存的效果,是因为String 对象的设计采用了immutable 这种设计模式(Design Pattern),这是为了安全性的考量。 |