我想了解多线程环境中的性能。为此我写了一个小测试,在我的机器上运行(四核英特尔,Windows XP,Sun JDK 1.6.0_20),结果令人惊讶。多线程Java应用程序的性能
测试基本上是使用任一关键字或一个显式锁定同步的线程安全计数器。下面是代码:
import java.util.concurrent.locks.ReentrantLock;
public class SynchronizedPerformance {
static class Counter {
private static final int MAX = 1 << 24;
int count;
long lastLog = 0;
private final ReentrantLock lock = new ReentrantLock();
private int incrementAndGet() {
count++;
if (count == MAX) {
long now = System.nanoTime();
if (lastLog != 0) {
long elapsedTime = now - lastLog;
System.out.printf("counting took %.2f ns\n", Double.valueOf((double)elapsedTime/MAX));
}
lastLog = now;
count = 0;
}
return count;
}
synchronized int synchronizedIncrementAndGet() {
return incrementAndGet();
}
int lockedIncrementAndGet() {
lock.lock();
try {
return incrementAndGet();
} finally {
lock.unlock();
}
}
}
static class SynchronizedCounterAccessor implements Runnable {
private final Counter counter;
public SynchronizedCounterAccessor(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
while (true)
counter.synchronizedIncrementAndGet();
}
}
static class LockedCounterAccessor implements Runnable {
private final Counter counter;
public LockedCounterAccessor(Counter counter) {
this.counter = counter;
}
@Override
public void run() {
while (true)
counter.lockedIncrementAndGet();
}
}
public static void main(String[] args) {
Counter counter = new Counter();
final int n = Integer.parseInt(args[0]);
final String mode = args[1];
if (mode.equals("locked")) {
for (int i = 0; i < n; i++)
new Thread(new LockedCounterAccessor(counter), "ca" + i).start();
} else if (mode.equals("synchronized")) {
for (int i = 0; i < n; i++)
new Thread(new SynchronizedCounterAccessor(counter), "ca" + i).start();
} else {
throw new IllegalArgumentException("locked|synchronized");
}
}
}
我提出以下意见:
java SynchronizedPerformance 1 synchronized
工作得很好,并采取每步大约15纳秒。java SynchronizedPerformance 2 synchronized
干扰很多,每步大约需要150 ns。- 当我开始的
java SynchronizedPerformance 2 synchronized
两个独立的过程它们中的每需要每步大约100纳秒。也就是说,第二次启动过程会使第一个(和第二个)更快。
我不明白第三观察。这种现象存在什么合理的解释?
你需要重复运行的微基准测试,否则自然变异会在测量中压倒任何实际信号。运行数十次或数百次。 – 2010-10-26 22:09:53
我已经做了。效果是一样的。特别是在场景3中,当我只启动一个进程时,应用程序很慢,而且每当我启动第二个进程时,应用程序都会更快。当我稍后停止第二个过程时,第一个过程再次变慢。 – 2010-10-27 06:02:37