访问字符串内字符的几种方法的性能测试
synhy 2006-05-22 10:31:27 尝想做个处理文本的程序,考虑性能,对想到的访问字符串内单个字符的性能做个测试,简单写了个程序打印耗时,也好有个量的概念。代码如下:
public class test{
public test(){
}
public static void main(String argv[])
{
String test="..."; //很长的测试字符串
StringBuffer test1=new StringBuffer(test);
int i,j,ilen = test.length(),times=100000; //每种方式测试次数
char ch;
byte chset[];
long t1=0,t2=0;
System.out.println("test string length:" + String.valueOf(ilen) + "Bytes"); //打印测试字符串长度
t1 = System.currentTimeMillis();
for(j=0;j<times;j++){
for(i=0;i<ilen;i++){
ch = test.charAt(i);
}
i=0;
}
t2 = System.currentTimeMillis();
System.out.println("test1 over:" + String.valueOf(t2-t1) + "ms");
chset = test.getBytes();
t2 = System.currentTimeMillis();
for(j=0;j<times;j++){
for(i=0;i<ilen;i++){
ch = (char)chset[i];
}
i=0;
}
t1 = System.currentTimeMillis();
System.out.println("test2 over:" + String.valueOf(t1-t2) + "ms");
ilen = test1.length();
t1 = System.currentTimeMillis();
for(j=0;j<times;j++){
for(i=0;i<ilen;i++){
ch = test1.charAt(i);
}
i=0;
}
t2 = System.currentTimeMillis();
System.out.println("test3 over:" + String.valueOf(t2-t1) + "ms");
}
}
运行结果如下:
D:\Program\J2SE>java test
test string length:7708Bytes
test1 over:3657ms
test2 over:2156ms
test3 over:15750ms
D:\Program\J2SE>java test
test string length:7708Bytes
test1 over:3671ms
test2 over:2156ms
test3 over:15688ms
D:\Program\J2SE>java test
test string length:7708Bytes
test1 over:3672ms
test2 over:2172ms
test3 over:15141ms
简要分析:
方式1:直接用String.charAt(i) 访问,可能是多了一个函数调用,增加了耗时,里面应该也是数组的形式访问的;
方式2:先将String转成数组,速度较快,每次耗时大概是方式1的60%。
方式3:使用StringBuffer.charAt(i)访问,速度慢的太多了。Buffer的方式应该是适合字符串的添加删除操作,用来访问字符,速度太慢。
后记:
暂时只想到了这么几种方式。
想既然数据都出来了,就发上来供大家看看。各种方式为何时间差别较大,有谁知道的也望告知一下。