量锁的开销了么? 我们的结论成熟么?或者还有没有其他的情况?在本文的第二部分里,我们将会 深入研究这个基准测试,力争回答这些问题。在这个过程中,我们会发现获取结 果并不困难,困难的是判断出这些结果是否可以回答前面提出的问题。
public class LockTest {
private static final int MAX = 20000000; // 20 million
public static void main(String[] args) throws InterruptedException {
// warm up the method cache
for (int i = 0; i < MAX; i++) {
concatBuffer("Josh", "James", "Duke");
concatBuilder("Josh", "James", "Duke");
}
System.gc();
Thread.sleep(1000);
System.out.println("Starting test");
long start = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
concatBuffer("Josh", "James", "Duke");
}
long bufferCost = System.currentTimeMillis() - start;
System.out.println("StringBuffer: " + bufferCost + " ms.");
System.gc();
Thread.sleep(1000);
start = System.currentTimeMillis();
for (int i = 0; i < MAX; i++) {
concatBuilder("Josh", "James", "Duke");
}
long builderCost = System.currentTimeMillis() - start;
System.out.println("StringBuilder: " + builderCost + " ms.");
System.out.println("Thread safety overhead of StringBuffer: "
+ ((bufferCost * 10000 / (builderCost * 100)) - 100) + "%\n");
}
public static String concatBuffer(String s1, String s2, String s3) {
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
sb.append(s3);
return sb.toString();
}
public static String concatBuilder(String s1, String s2, String s3) {
StringBuilder sb = new StringBuilder();
sb.append(s1);
sb.append(s2);
sb.append(s3);
return sb.toString();
}
}
Java 6中的线程优化真的有效么?(4)
时间:2011-05-20 infoq.com Jeroen Borgers 译:韩锴
运行基准测试
我运行这个测试的环境是:32位的Windows Vista笔记本电脑,配有Intel Core 2 Duo,使用Java 1.6.0_04。请注意,所有的优化都是在Server VM上实现 的。但这在我的平台上不是默认的VM,它甚至不能在JRE中使用,只能在JDK中使 用。为了确保我使用的是Server VM,我需要在命令行上打开-server选项。其他 的选项包括:
-XX:+DoEscapeAnalysis, off by default
-XX:+UseBiasedLocking, on by default
-XX:+EliminateLocks, on by default
编译源代码,运行下面的命令,可以启动测试:
java-server -XX:+DoEscapeAnalysis LockTest 关于Jeroen Borgers
Jeroen Borger是Xebia的资深咨询师。Xebia是一家国际IT咨询与项目组织公 司,专注于企业级Java和敏捷开发。Jeroen帮助他的客户攻克企业级Java系统的 性能问题,他同时还是Java性能调试课程的讲师。他在从1996年开始就可以在不 同的Java项目中工作,担任过开发者、架构师、团队lead、质量负责人、顾问、 审核员、性能测试和调试员。他从2005年开始专注于性能问题。
鸣谢
没有其他人的鼎力相助,是不会有这篇文章的。特别感谢下面的朋友:
Dr. Cliff Click,原Sun公司的Server VM主要架构师,现工作在Azul System ;他帮我分析,并提供了很多宝贵的资源。
Kirk Pepperdine,性能问题的权威,帮助我编辑文章。 |