日期:2014-05-18  浏览次数:20779 次

JAVA性能之toUpperCase


StringBuffer upp = new StringBuffer(),
 low = new StringBuffer();

for(int i = 0; i<=9000000; i++){
upp.append("AA");
low.append("aa");
}
long Tupp = System.currentTimeMillis();
upp.toString().toUpperCase();
System.out.println("UPP:"+(System.currentTimeMillis()-Tupp));

long Tlow = System.currentTimeMillis();
low.toString().toUpperCase();
System.out.println("LOW:"+(System.currentTimeMillis()-Tlow));


这样执行N次,都是UPP<LOW;

如果把上述的1个A变成a,即:用Aa和aa比较,则UPP>LOW,想知道这是为什么?看toUpperCase源码也没有明白。
Java

------解决方案--------------------
这样执行N次,都是UPP<LOW; 那是当然,一个不用转换,一个要转换。前者当然快。



  for(int i = 0; i<=9000000; i++){
            upp.append("Aa");
            low.append("Aa");
        }

//代码块1
        long Tupp = System.currentTimeMillis();
        upp.toString().toUpperCase();
        System.out.println("UPP:"+(System.currentTimeMillis()-Tupp));
//代码块1    
//代码块2    
       long Tlow = System.currentTimeMillis();
low.toString().toLowerCase();
System.out.println("LOW:" + (System.currentTimeMillis() - Tlow));
//代码块2 

//代码块3
        long Tupp2 = System.currentTimeMillis();
upp.toString().toUpperCase();
System.out.println("UPP:" + (System.currentTimeMillis() - Tupp2));
//代码块3  


这个代码你去执行下。
代码块3和1都是一样的。我执行的结果是 1的时间永远比2多。但是2和3的大小是不一定的。
我觉得原因在于1执行的时候要加载一些toUpperCase方法涉及到得类和方法。
所以1慢,但是2和3的时候加载过了。自然就快了。转换过程中涉及CPU占用,有时候执行toUpperCase时分配到得时间片足够执行,耗时少。有时候反而是转小写能够执行的更多(操作系统对线程调度,你没法控制,jvm也没办法。)
所以大小写转换方法效率几乎是一样的。
ps,C#中微软有针对转大写方法的特别优化,所以一般选择转大写后比较字符串。