当前位置:  编程技术>java/j2ee

Java中的StringBuilder性能测试

    来源: 互联网  发布时间:2014-11-07

    本文导语:  在看KMP算法时,想要简单的统计一下执行时间和性能。 得出的结论是: Java的String的indexOf方法性能最好,其次是KMP算法,其次是传统的BF算法,当然,对比有点牵强,SUN的算法也使用Java来实现、用的看着不像是KMP,还需要详细...

在看KMP算法时,想要简单的统计一下执行时间和性能。

得出的结论是: Java的String的indexOf方法性能最好,其次是KMP算法,其次是传统的BF算法,当然,对比有点牵强,SUN的算法也使用Java来实现、用的看着不像是KMP,还需要详细研究一下。

测试代码如下所示:

package com.test.test.kmp;

import java.util.Random;

public class KMPTest {

	public static void main(String[] args) {
		test();
	}
	
	//
	public static void test() {
		//
		int allLen = 8000000;
		int subLen = 11;
		int charLen = 4;
		String cl = buildString(charLen);
		int times = 50;
		//
		testMatch(allLen, subLen, cl, times);
	}
	
	public static void testMatch(int allLen, int subLen, String cl, int times){
		int allBF = 0;
		int allString = 0;
		int allKMP = 0;
		int allGC = 0;
		int allbuild = 0;
		int alltoArray = 0;
		
		long start = System.currentTimeMillis();
		
		System.out.println("--------------------------");
		for (int i = 0; i < times; i++) {
			// 1. 构造字符串的损耗
			long buildStart = System.currentTimeMillis();
			String sub = buildString(subLen, cl);
			String all = buildString(allLen, sub) +sub;
			long buildEnd = System.currentTimeMillis();
			allbuild += (buildEnd - buildStart);
			// 2. toCharArray的损耗
			long toArrayStart = System.currentTimeMillis();
			char[] allArray = all.toCharArray();
			char[] subArray = sub.toCharArray();
			long toArrayEnd = System.currentTimeMillis();
			alltoArray += (toArrayEnd - toArrayStart);
			//
			long startBF = System.currentTimeMillis();
			int indexBF = bfIndexOf(all, sub);
			long endBF = System.currentTimeMillis();
			//
			long timeoutBF = endBF - startBF;
			allBF += timeoutBF;
			System.gc();
			allGC += (System.currentTimeMillis() - endBF);
	
			//
			long startString = System.currentTimeMillis();
			int indexString = stringIndexOf(all, sub);
			long endString = System.currentTimeMillis();
			//
			long timeoutString = endString - startString;
			allString += timeoutString;
			System.gc();
			allGC += (System.currentTimeMillis() - endString);
			

			//
			long startKMP = System.currentTimeMillis();
			//int indexKMP = kmpIndexOf(all, sub);
			int indexKMP = KMP_Index(allArray, subArray);
			long endKMP = System.currentTimeMillis();
			//
			long timeoutKMP = endKMP - startKMP;
			allKMP += timeoutKMP;
			System.gc();
			allGC += (System.currentTimeMillis() - endKMP);
			
			//
			//System.out.println("all="+all.substring(0,100)+" ......");
			//System.out.println("sub="+sub);
			//
			//System.out.println("indexBF="+indexBF+";耗时: "+timeoutBF+"ms");
			//System.out.println("indexString="+indexString+";耗时: "+timeoutString+"ms");
			if(indexBF == indexString && indexKMP == indexString){
				//System.out.println("!!!!对比相等。");
			} else {
				throw new RuntimeException("对比出错.");
			}
			
			//
			if(i % 20 == 10){
				System.out.println(i+"次bfIndexOf= "+allBF+"ms");
				System.out.println(i+"次stringIndexOf= "+allString+"ms");
				System.out.println(i+"次KMPIndexOf= "+allKMP+"ms");
				System.out.println(i+"次allbuild= "+allbuild+"ms");
				System.out.println(i+"次alltoArray= "+alltoArray+"ms");
				System.out.println(i+"*3次,GC= "+allGC+"ms");
				long end = System.currentTimeMillis();
				long allTime = end-start;
				long lossTime = allTime - (allBF+allString+allKMP+allGC);
				System.out.println(i+"次,所有总计耗时: "+(allTime)+"ms; 损耗:" + lossTime +"ms; 损耗比: " +((0.0+lossTime)/allTime * 100)+"%");
				System.out.println("--------------------------");
			}
			
		}
		//
		System.out.println(times+"次bfIndexOf;总计耗时: "+allBF+"ms");
		System.out.println(times+"次stringIndexOf;总计耗时: "+allString+"ms");
		System.out.println(times+"次KMPIndexOf;总计耗时: "+allKMP+"ms");
		System.out.println(times+"次allbuild= "+allbuild+"ms");
		System.out.println(times+"次alltoArray= "+alltoArray+"ms");
		System.out.println(times+"*3次,GC;总计耗时: "+allGC+"ms");
		long end = System.currentTimeMillis();
		long allTime = end-start;
		long lossTime = allTime - (allBF+allString+allKMP+allGC);
		System.out.println(times+"次,所有总计耗时: "+(allTime)+"ms; 损耗:" + lossTime +"ms; 损耗比: " +((0.0+lossTime)/allTime * 100)+"%");
		System.out.println("--------------------------");
		
	}
	
	//
	
	
	// 构建字符

	public static String buildString(int len){
		return buildString(len, null);
	}
	public static String buildString(int len, String sub){
		//
		final int TYPE_NUMBER = 0;
		final int TYPE_LOWERCASE = 1;
		final int TYPE_UPPERCASE = 2;
		//
		long seed = System.nanoTime();
		Random random = new Random(seed);
		//
		//
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < len; i++) {
			//
			int type = random.nextInt(3);// 0-2
			int cvalue = 0;
			if(TYPE_NUMBER == type){
				cvalue = '0' + random.nextInt(10);// 0~(n-1)
			} else if(TYPE_LOWERCASE == type){
				cvalue = 'a' + random.nextInt(26);// 0~(n-1)
			} else if(TYPE_UPPERCASE == type){
				cvalue = 'A' + random.nextInt(26);// 0~(n-1)
			} else {
				throw new RuntimeException(Random.class.getName()+"#newxtInt(int);Wrong!");
			}
			//
			//cvalue = 'A' + random.nextInt(26);// 0~(n-1)
			//
			char c = (char)cvalue;
			if(null != sub && sub.length() > 1){
				int index = random.nextInt(sub.length());
				c = sub.charAt(index);
			}
			//String s = String.valueOf(c);
			builder.append(c);
			//
		}
		//
		return builder.toString();
	}
	
	


	/**
	 * Java自带的方法,内部实现了
	 * @param all
	 * @param sub
	 * @return
	 */
	public static int stringIndexOf(String all, String sub){
		// 防御式编程
		if(null == all || null== sub){
			return -1;
		}
		// 调用Java的String方法
		return all.indexOf(sub);
	}
	
	
	/**
	 * BF算法
	 * @param all
	 * @param sub
	 * @return
	 */
	public static int bfIndexOf(String all, String sub){
		// 防御式编程
		if(null == all || null== sub){
			return -1;
		}
		//
		int lenAll = all.length();
		int lenSub = sub.length();
		int i = 0;
		while (i < lenAll) {
			// 从i下标开始对比
			int j = 0;
			while (j < lenSub) {
				//
				char all_i = all.charAt(i);
				char sub_j = sub.charAt(j);
				if(all_i == sub_j){
					// 相等则继续对比下一个字符
					i++;
					j++; // 这个增长很重要
				} else {
					// 否则跳出内层循环
					break;
				}
			}
			// 如果 j 增长到和 lenSub相等,则匹配成功
			if(lenSub == j){
				return i - lenSub;
			} else {
				i = 1+i - j; // 回溯 i
			}
		}
		//
		return -1;
	}
	

	/**
	 * KMP 算法
	 * @param all
	 * @param sub
	 * @return
	 */
	public static int kmpIndexOf(String all, String sub){
		//
		char[] allArray = all.toCharArray(); 
		char[] subArray = sub.toCharArray(); 
		//
		return KMP_Index(allArray, subArray);
	}
  /** 
   * 获得字符串的next函数值 
   * 
   * @param t 
   *      字符串 
   * @return next函数值 
   */ 
  public static int[] next(char[] t) { 
    int[] next = new int[t.length]; 
    next[0] = -1; 
    int i = 0; 
    int j = -1; 
    while (i < t.length - 1) { 
      if (j == -1 || t[i] == t[j]) { 
        i++; 
        j++; 
        if (t[i] != t[j]) { 
          next[i] = j; 
        } else { 
          next[i] = next[j]; 
        } 
      } else { 
        j = next[j]; 
      } 
    } 
    return next; 
  } 
 
  /** 
   * KMP匹配字符串 
   * 
   * @param allArray 
   *      主串 
   * @param subArray 
   *      模式串 
   * @return 若匹配成功,返回下标,否则返回-1 
   */ 
	public static int KMP_Index(char[] allArray, char[] subArray) { 
    int[] next = next(subArray); 
    int i = 0; 
    int j = 0; 
    while (i 

    
 
 

您可能感兴趣的文章:

  • java命名空间java.lang类stringbuilder的类成员方法: stringbuilder定义及介绍
  • 全面解释java中StringBuilder、StringBuffer、String类之间的关系
  • java命名空间java.lang类stringbuilder的类成员方法: capacity定义及介绍
  • java中String与StringBuilder的区别
  • java命名空间java.lang类stringbuilder的类成员方法: length定义及介绍
  • Java之String、StringBuffer、StringBuilder的区别分析
  • java命名空间java.lang类stringbuilder的类成员方法: trimtosize定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: appendcodepoint定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: append定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: delete定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: reverse定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: deletecharat定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: ensurecapacity定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: tostring定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: substring定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: insert定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: replace定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: setcharat定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: indexof定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: lastindexof定义及介绍
  • java命名空间java.lang类stringbuilder的类成员方法: codepointat定义及介绍
  • 急!请问有分析java程序性能瓶颈的工具吗?例如,统计 java 程序中函数调用次数?
  • JAVA性能大观
  • Java程序性能分析工具 VisualVM
  • Java性能基准测试套件 SPECjvm2008
  • Java高性能集合类 ConcurrentLinkedHashMap
  • 性能计数器的Java本地接口 PAPI
  • 高性能Java网络框架 MINA
  • Java的开源高性能memcached客户端 XMemcached
  • 服务湍开发用linux c和java开发哪个性能更好
  • 高性能的Java 3D引擎 Xith3D
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Java测试工具 GroboUtils
  • Java测试工具 Jameleon
  • Java测试框架 JMockit
  • Java的GUI自动测试工具 Maveryx
  • Java模拟测试工具 jMock
  • Java代码覆盖测试分析工具 Clover
  • Java单元测试框架 JUnit
  • Java 代码优化和测试工具 JTest
  • Java 自动化测试工具 Concordion
  • Java自动化SQL注入测试工具 jSQL
  • Java多线程单元测试 Thread Weaver
  • 性能计数器的Java本地接口 PAPI iis7站长之家
  • 请各位推荐几种 java 的压力测试工具。
  • Java测试框架 Mockito
  • Java 测试规范框架 Spek
  • Java连续测试工具 Infinitest
  • java拦截/调试/安全测试工具 JavaSnoop
  • Java自动化测试框架 Fressia
  • 介绍几本电子书还有,java的开发环境及测试环境在那下载
  • Java测试框架 Spock
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3