由UUID和短域名想到的(续一)

由UUID和短域名想到的,帖子 http://www.iteye.com/topic/1017979
由UUID和短域名想到的,博客 http://zhaiyz.iteye.com/blog/1018906

本文继续研究22位UUID的使用。
现在用来生成22位UUID的方法使用 william_ai这位仁兄提供的。

现对产生22位UUID的效率与产生36位UUID的效率做对比。
以后还会继续对分别用它们做主键,建立索引的使用效率做对比。

代码如下:
import java.util.UUID;

public class UUIDUtil {
	public static final char[] charMap;
	static {
		charMap = new char[64];
		for (int i = 0; i < 10; i++) {
			charMap[i] = (char) ('0' + i);
		}
		for (int i = 10; i < 36; i++) {
			charMap[i] = (char) ('a' + i - 10);
		}
		for (int i = 36; i < 62; i++) {
			charMap[i] = (char) ('A' + i - 36);
		}
		charMap[62] = '_';
		charMap[63] = '-';
	}

	public static String hexTo64(String hex) {
		StringBuffer r = new StringBuffer();
		int index = 0;
		int[] buff = new int[3];
		int l = hex.length();
		for (int i = 0; i < l; i++) {
			index = i % 3;
			buff[index] = Integer.parseInt("" + hex.charAt(i), 16);
			if (index == 2) {
				r.append(charMap[buff[0] << 2 | buff[1] >>> 2]);
				r.append(charMap[(buff[1] & 3) << 4 | buff[2]]);
			}
		}
		return r.toString();
	}

	public static String getUUID() {
		StringBuffer sb = new StringBuffer("0");
		String uuid = UUID.randomUUID().toString();
		uuid = uuid.replaceAll("-", "").toUpperCase();
		sb.append(uuid);
		uuid = hexTo64(sb.toString());
		return uuid;
	}

	public static void main(String[] args) {

		int count = 100000;

		// 计算循环一千万次所用时间
		long start = System.nanoTime();
		for (int i = 0; i < count; i++) {
		}
		long end = System.nanoTime();
		long f = end - start;
		System.out.println("循环10W次所用时间:" + Float.valueOf(f) / 1000000 + "毫秒");

		@SuppressWarnings("unused")
		String uuid = null;
		// 计算使用getUUID()得到一千万个数据所用时间
		start = System.nanoTime();
		for (int i = 0; i < count; i++)
			uuid = getUUID();
		end = System.nanoTime();
		long l1 = end - start - f;
		System.out.println("计算使用getUUID()得到10W个数据所用时间:"
				+ (Float.valueOf(end - start - f) / 1000000) + "毫秒");

		// 计算使用randomUUID()得到一千万个数据所用时间
		start = System.nanoTime();
		for (int i = 0; i < count; i++)
			uuid = UUID.randomUUID().toString();
		end = System.nanoTime();
		long l2 = end - start - f;
		System.out.println("计算使用randomUUID()得到10W个数据所用时间:"
				+ (Float.valueOf(end - start - f) / 1000000) + "毫秒");

		System.out.println("用getUUID()取得一个数据所用的时间是用randomUUID()取得一个数据的"
				+ (Float.valueOf(l1) / Float.valueOf(l2)) + "倍");
	}
}

输出结果:
循环10W次所用时间:1.238204毫秒
计算使用getUUID()得到10W个数据所用时间:1324.7645毫秒
计算使用randomUUID()得到10W个数据所用时间:283.0976毫秒
用getUUID()取得一个数据所用的时间是用randomUUID()取得一个数据的4.679533倍


结论:
虽然产生22位UUID所用的时间是产生36位UUID的时间的4倍多,但产生10W个数据所用的时间为1秒多,也是可以接受的,而且本人机子的性能为中等,服务器上应该快的多,完全够用。

你可能感兴趣的:(F#,Blog,ITeye)