ページ

2009年3月4日

javaのロックのコスト かも

とある理由からJavaのロックってどれくらいコストがかかるのか調べてみました。使ったJavaのコードは下の奴です。

import java.util.*;

public class test implements Runnable {
public static void main(String[] argv) {
int threadNum = Integer.parseInt(argv[0]);

test t = new test();
t.doIt(threadNum);
}
long total = 0;
public void doIt(int numThread) {
List<Thread> threads = new ArrayList<Thread>();
for (int i=0; i<numThread; i++) {
Thread thread = new Thread(this);
threads.add(thread);
}
long start = System.currentTimeMillis();
for (Thread t: threads) {
t.start();
}
for (Thread t: threads) {
try {
t.join();
} catch(Exception e) {
e.printStackTrace();
}
}
long end = System.currentTimeMillis();
System.out.println("" + numThread + "," + (end - start));
}

public void run() {
for (int j=0; j<100; j++) {
for (int i=0; i<1000; i++) {
synchronized(this) {
total += 1;
}
}
}
}
}
このプログラムをスレッド数を1から100までループでごりごり回します。テストした環境はMacじゃなくってLinuxでAthron x2 5000/memory 2Gです。今回はメモリは関係ないですが・・・。
結果をプロットしたものがこれ。横軸がスレッド数。縦軸が実行時間(ミリ秒)です。

基本的には線形に伸びています。何回か計測しましたが、40から50スレッドのところに溝があります。謎です。溝の前後は比較的安定した線形ですが、スレッド数が大きい方がなだらかなのは強豪の結果でしょう。でもこのグラフ、不思議過ぎます。

0 件のコメント: