Java理论和实践: 一个有缺陷的微基准的解析[Java编程]
本文“Java理论和实践: 一个有缺陷的微基准的解析[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
即便性能不是当前项目的一个关键需求,乃至没有被标明为一个需求,普通也难于忽视性能问题,因为您大概会认为忽视性能问题将使自己成为“差劲的工程师”.开辟人员在以编写高性能代码为目标的时刻,常常会编写小的基准程序来器量一种办法相关于另一种办法的性能.不幸的是,正如您在 December 撰写的 "动态编译与性能丈量" 这期文章中所看到的,与其他静态编译的语言相比,评论用 Java 语言编写的给定惯用法(idiom)或构造体的性能要艰可贵多.
一个有缺陷的微基准
在我发表了十月份的文章 "JDK 5.0 中更机动、更具可伸缩性的锁定机制" 之后,一个同事给我发了 SyncLockTest 基准(如清单 1 所示),据说用它可以判断 synchronized 与新的 ReentrantLock 类哪一个“更快”.他在自己的手提电脑上运行了该基准之后,作出了与那篇文章差别的结论,说同步要更快些,并且给出了他的基准作为“证据”.整个历程 —— 微基准的计划、实现、履行和对后果的注释 —— 在很多方面都存在缺陷.其实我这个同事是个很聪明的家伙,并且对这个基准也花了不少工夫,可见这种事有多难.
清单 1. 有缺陷的 SyncLockTest 微基准
interface Incrementer {
void increment();
}
class LockIncrementer implements Incrementer {
private long counter = 0;
private Lock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
++counter;
} finally {
lock.unlock();
}
}
}
class SyncIncrementer implements Incrementer {
private long counter = 0;
public synchronized void increment() {
++counter;
}
}
class SyncLockTest {
static long test(Incrementer incr) {
long start = System.nanoTime();
for(long i = 0; i < 10000000L; i++)
incr.increment();
return System.nanoTime() - start;
}
public static void main(String[] args) {
long synchTime = test(new SyncIncrementer());
long lockTime = test(new LockIncrementer());
System.out.printf("synchronized: %1$10dn", synchTime);
System.out.printf("Lock: %1$10dn", lockTime);
System.out.printf("Lock/synchronized = %1$.3f",
(double)lockTime/(double)synchTime);
}
}
SyncLockTest 定义了一个接口的两种实现,并利用 System.nanoTime() 来计算每种实现运行 10,000,000 次的时间.在保证线程安全的情形下,每种实现增添一个计数器;此中一种实现利用内建的同步,而另一种实现则利用新的 ReentrantLock 类.此举的目的是答复以下问题:“哪一个更快,同步还是 ReentrantLock?”让我们看看为什么这个表面上没有问题的基准终究没能成功地器量出想要器量的东西,乃至没有器量出任何有效的东西.
以上是“Java理论和实践: 一个有缺陷的微基准的解析[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |