亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中的StringBuilder性能測試

2019-11-26 15:26:02
字體:
來源:轉載
供稿:網友

在看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 <= allArray.length - 1 && j <= subArray.length - 1) {       if (j == -1 || allArray[i] == subArray[j]) {         i++;         j++;       } else {         j = next[j];       }     }     if (j < subArray.length) {       return -1;     } else       return i - subArray.length; // 返回模式串在主串中的頭下標   } }

測試的一個結果如下所示:

--------------------------10次bfIndexOf= 94ms10次stringIndexOf= 56ms10次KMPIndexOf= 76ms10次allbuild= 5870ms10次alltoArray= 137ms10*3次,GC= 155ms10次,所有總計耗時: 6388ms; 損耗:6007ms; 損耗比: 94.03569192235442%--------------------------30次bfIndexOf= 365ms30次stringIndexOf= 222ms30次KMPIndexOf= 295ms30次allbuild= 16452ms30次alltoArray= 395ms30*3次,GC= 452ms30次,所有總計耗時: 18184ms; 損耗:16850ms; 損耗比: 92.66388033435987%--------------------------50次bfIndexOf;總計耗時: 550ms50次stringIndexOf;總計耗時: 335ms50次KMPIndexOf;總計耗時: 450ms50次allbuild= 26501ms50次alltoArray= 637ms50*3次,GC;總計耗時: 734ms50次,所有總計耗時: 29211ms; 損耗:27142ms; 損耗比: 92.91705179555647%--------------------------

從中可以看出來,使用StringBuilder構造字符串,800萬*50次append大約消耗了26秒。換算下來每秒鐘是1600萬次。。。
看來是需要寫一個專門計時的函數,本來Junit是有自己的統計的,但是樣本不太好做。

如此看來,數據的準備,也就是測試用例的選取很關鍵,可能需要先生成并寫入到文本文件中。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
伊人久久久久久久久久久久久| www.日本久久久久com.| 午夜精品久久久99热福利| 国产精品免费一区豆花| 成人国产精品一区二区| 欧美韩国理论所午夜片917电影| 欧美激情一二三| 91av在线免费观看| 97超碰蝌蚪网人人做人人爽| 中文字幕精品www乱入免费视频| 精品久久久国产精品999| 久久亚洲国产精品| 狠狠久久五月精品中文字幕| 欧美性视频网站| 国产精品盗摄久久久| 中文字幕久热精品视频在线| 久久视频在线播放| 青青草国产精品一区二区| 久久久中精品2020中文| 亚洲精品视频在线观看视频| 久久高清视频免费| 91精品中国老女人| 欧美另类交人妖| 亚洲缚视频在线观看| 亚洲a在线观看| 亚洲综合精品伊人久久| 欧美日韩国产中文字幕| 久久国内精品一国内精品| 成人免费福利在线| 亚洲伦理中文字幕| 国产成人自拍视频在线观看| 久久久999精品视频| 亚洲国产精品va在线看黑人动漫| 91精品国产高清久久久久久| 在线免费看av不卡| 在线观看日韩欧美| 97人人做人人爱| 欧美在线视频观看免费网站| 精品日韩美女的视频高清| 中文字幕欧美专区| 亚洲人成在线播放| 国产99久久精品一区二区永久免费| 日韩免费观看在线观看| 国产一区二区在线播放| 69久久夜色精品国产69| 久久久国产在线视频| 欧美高清视频在线观看| 中文字幕亚洲欧美日韩在线不卡| 日本久久亚洲电影| 夜夜嗨av一区二区三区免费区| 欧美日本在线视频中文字字幕| 91久久久久久国产精品| 日韩精品中文字幕久久臀| 亚洲视频免费一区| 成人在线视频网| 欧洲美女7788成人免费视频| 亚洲综合大片69999| 久久久噜噜噜久噜久久| 国产suv精品一区二区| 久久影视免费观看| 欧美性猛交xxxx偷拍洗澡| 国产91精品久久久久久| 国产91精品久久久| 中文字幕久久久av一区| 午夜精品美女自拍福到在线| 亚洲第一精品久久忘忧草社区| 一区二区欧美亚洲| 欧美性猛交xxx| 日韩经典第一页| 欧美性xxxx极品hd满灌| 日韩毛片在线看| 成人亚洲综合色就1024| 国产精品揄拍一区二区| 国产精品视频精品| 中文字幕精品网| 欧美亚洲国产日本| 日韩精品久久久久久久玫瑰园| 国产精品久久久久aaaa九色| 亚洲欧洲第一视频| 中文在线资源观看视频网站免费不卡| 久久久亚洲国产天美传媒修理工| 91精品国产91久久| 97在线视频国产| 欧美性生活大片免费观看网址| www.亚洲男人天堂| 国产免费一区二区三区香蕉精| 成人久久18免费网站图片| 亚洲欧美色婷婷| 青青久久av北条麻妃黑人| 成人动漫网站在线观看| 伦理中文字幕亚洲| 萌白酱国产一区二区| 亚洲色图偷窥自拍| 亚洲第一精品久久忘忧草社区| 在线日韩欧美视频| 国产一区二区三区精品久久久| 久久久久久欧美| 欧美激情一区二区三区久久久| 国产精品69精品一区二区三区| 91嫩草在线视频| 国产97人人超碰caoprom| 超碰日本道色综合久久综合| 国产成人一区二区| 青青草原成人在线视频| 久久99精品久久久久久琪琪| 日本成人精品在线| 国产精品第一第二| 国产精品老牛影院在线观看| 亚洲自拍偷拍福利| 久久久久99精品久久久久| 正在播放亚洲1区| 这里精品视频免费| 亚洲国产欧美一区二区丝袜黑人| 欧美超级乱淫片喷水| 九九视频这里只有精品| 欧美三级xxx| 久热精品视频在线观看| 欧美日韩国产激情| 精品国产成人av| 国产精品第8页| 亚洲欧美日韩中文视频| 国产欧美va欧美va香蕉在线| 国产精品偷伦一区二区| 色中色综合影院手机版在线观看| 亚洲影院色在线观看免费| 国产综合久久久久久| 日韩在线视频二区| 亚洲第一网站男人都懂| 欧美性xxxx| 中文字幕亚洲欧美日韩在线不卡| 国产精品亚洲美女av网站| 国产精品久久久久久久久影视| 久久久精品一区二区| 色综合久久88色综合天天看泰| 大胆欧美人体视频| 久久精品国产亚洲一区二区| 精品日本美女福利在线观看| 欧美国产日产韩国视频| www.欧美精品一二三区| 亚洲四色影视在线观看| 欧美性色xo影院| 国产成人拍精品视频午夜网站| 欧美与欧洲交xxxx免费观看| 欧美亚洲视频一区二区| 法国裸体一区二区| 国产精品流白浆视频| 岛国av一区二区| 欧美大片免费观看| 欧美专区福利在线| 粉嫩老牛aⅴ一区二区三区| 国产午夜精品免费一区二区三区| 91免费看视频.| 欧美高清在线观看| 亚洲视频在线免费看| 日本欧美精品在线| 国产精品一区二区三区免费视频| 一区二区三区久久精品| 亚洲精品综合精品自拍| 欧美国产日韩一区二区三区| 欧美亚洲成人免费| 亚洲女人被黑人巨大进入| 欧美肥老妇视频| 成人国产精品一区二区| 日本三级韩国三级久久|