屹砾

屹砾技术博客,记录生活点滴。
Email/QQ/MSN/GTalk: eli.wuhan@gmail.com

留言簿

积分与排名

Growing & Life

JavaSE & JavaEE

Linux & Unix

时事点评

阅读排行榜

评论排行榜

char[]与StringBuffer处理性能测试

 

  1package eli.sample;
  2
  3/**
  4 * char[]和StringBuilder字符处理测试,
  5 * 验证创建对象的时间耗费。
  6 * <p>
  7 * <code>toHexByCharArray(byte[] bt)</code>方法每次都重复利用字符数组来缓存结果,
  8 * <code>toHexByStringBuilder(byte[] bt)</code>方法每次新建一个StringBuilder对象来保存结果,
  9 * 因为新建对象是要耗费时间的,所以从测试结果来看,<code>toHexByCharArray(byte[] bt)</code>方法
 10 * 所花费时间仅为<code>toHexByStringBuilder(byte[] bt)</code>方法的40%。
 11 * </p>
 12 * 
 13 * @author <a href="mailto:eli.wuhan@gmail.com">屹砾</a>,博客:<a
 14 * href=http://eli.blogjava.net target="_blank">屹砾之家</a>
 15 * @version Nov 23, 2007
 16 */

 17public class StringProcessSample {
 18    // 十六进制数字
 19
 20    private static char[] HEX = '0''1''2''3''4''5''6''7''8',
 21            '9''A''B''C''D''E''F' }
;
 22
 23    // 缓存十六进制数字字符串
 24
 25    private char[] ch = new char[32];
 26
 27    /**
 28     * 将指定的byte数组转换成十六进制数字字符串。
 29     * 
 30     * @param bt
 31     * byte数组
 32     * @return 十六进制数字字符串。
 33     */

 34    public String toHexByCharArray(byte[] bt) {
 35        int len = bt.length;
 36        for (int i = 0; i < len; i++{
 37            ch[i * 2= HEX[bt[i] >> 4 & 0xF];
 38            ch[i * 2 + 1= HEX[bt[i] & 0xF];
 39        }

 40        return new String(ch, 0, len * 2);
 41    }

 42
 43    /**
 44     * 将指定的byte数组转换成十六进制数字字符串。
 45     * 
 46     * @param bt
 47     * byte数组
 48     * @return 十六进制数字字符串。
 49     */

 50    public String toHexByStringBuilder(byte[] bt) {
 51        StringBuilder sb = new StringBuilder();
 52        for (byte b : bt) {
 53            sb.append(HEX[b >> 4 & 0xF]);
 54            sb.append(HEX[b & 0xF]);
 55        }

 56        return sb.toString();
 57    }

 58
 59    public void test() {
 60        // 准备一个字节数组
 61
 62        byte[] bt = new byte[] 1234567891011121315,
 63                1416 }
;
 64
 65        int loop = 10, times = 1000000;
 66        long s1 = 0L, s2 = 0L, s3 = 0L, t1 = 0L, t2 = 0L, tl1 = 0L, tl2 = 0L;
 67
 68        // 执行十次运算测试
 69
 70        for (int k = 1; k <= loop; k++{
 71            // 转换执行速度很快,连接执行很多次来计算时间
 72
 73            s1 = System.currentTimeMillis();
 74            for (int i = 0; i < times; i++{
 75                toHexByCharArray(bt);
 76            }

 77            s2 = System.currentTimeMillis();
 78            for (int i = 0; i < times; i++{
 79                toHexByStringBuilder(bt);
 80            }

 81            s3 = System.currentTimeMillis();
 82
 83            t1 = s2 - s1;// 使用char[]运行times次的时间
 84
 85            tl1 += t1;// 时间累加
 86
 87            t2 = s3 - s2;// 使用StringBuilder运行times次的时间
 88
 89            tl2 += t2;// 时间累加
 90
 91            System.out.println("\t" + k + ". char[]:" + t1
 92                    + "ms StringBuilder:" + t2 + "ms");
 93        }

 94        System.out.println("\ttotal " + loop + " times");
 95        System.out.println("\t char[]: " + tl1 + "ms StringBuilder: "
 96                + tl2 + "ms");
 97        System.out.println("\t char[]: " + (float) tl1 / tl2 * 100
 98                + "% StringBuilder: " + (float) tl2 / tl1 * 100 + "%");
 99    }

100
101    public static void main(String[] args) {
102        new StringProcessSample().test();
103    }

104}

105




从上面的测试结果可以看出:使用基本类型的性能要比使用对象的性能高出2倍多,所以为了性能应该尽量在不违反OOP的条件下采用基本数据类型。

posted on 2007-12-17 21:54 屹砾 阅读(396) 评论(0)  编辑  收藏 所属分类: JavaSE


标题  
姓名  
主页
验证码 *  
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-01-08 19:52 编辑过
 
 
相关链接:
网站导航: