以下のように、Map<I,O>ではなく、Map<I,MyFuture<O>>であるように改良と、Main()中で、改良前後の実行時間をそれぞれ表示することで改良されているかを確認するプログラムを実行しました。どのあたりがおかしいかわからないです。
MyFutureを使うということでしたので、MyFutureの定義をclass MemoConcにいれてみました。
class MemoConc3<I, O> implements Computable<I, O> {
Map<I, O> cache = new ConcMap<I, O>();
Computable<I, O> c;
MemoConc3(Computable<I, O> c) {
this.c = c;
}
public O compute(I input) {
O result = cache.get(input);
if (result == null) {
result = c.compute(input);
cache.put(input, result);
}
return result;
}
class MyFuture<V> {
private V value;
public synchronized void set(V v) {
value = v;
notifyAll();
}
public synchronized V get() {
try {
if(value == null) wait();
} catch(InterruptedException e) {}
return value;
}
}
}
class MemoConcTest2 extends Thread {
static int LOOP_COUNT = 64;
static int NUM_THREADS = Runtime.getRuntime().availableProcessors();
public static void main(String[] args) {
Computable<Integer, Boolean> f = new Memo<Integer, Boolean>(new Prime());
long t1 = System.currentTimeMillis();
int count = 0;
for (int i = 0; i < LOOP_COUNT; i++) {
for (int j = MemoConcThread.START; j < MemoConcThread.END; j++) {
if (f.compute(j)) {
count++;
}
}
}
long t2 = System.currentTimeMillis();
System.out.println("memo: " + count + ", " + (t2 - t1) + "ms");
MemoConcThread[] ts = new MemoConcThread[NUM_THREADS]; f = new MemoConc1<Integer, Boolean>(new Prime()); t1 = System.currentTimeMillis(); for (int i = 0; i < NUM_THREADS; i++) { ts[i] = new MemoConcThread(f, LOOP_COUNT / NUM_THREADS); ts[i].start(); } try { for (int i = 0; i < NUM_THREADS; i++) { ts[i].join(); } } catch (InterruptedException e) { } t2 = System.currentTimeMillis(); count = 0; for (int i = 0; i < NUM_THREADS; i++) { count += ts[i].getCount(); } System.out.println("memo conc1: " + count + ", " + (t2 - t1) + "ms"); f = new MemoConc2<Integer, Boolean>(new Prime()); t1 = System.currentTimeMillis(); for (int i = 0; i < NUM_THREADS; i++) { ts[i] = new MemoConcThread(f, LOOP_COUNT / NUM_THREADS); ts[i].start(); } try { for (int i = 0; i < NUM_THREADS; i++) { ts[i].join(); } } catch (InterruptedException e) { } t2 = System.currentTimeMillis(); count = 0; for (int i = 0; i < NUM_THREADS; i++) { count += ts[i].getCount(); } System.out.println("memo conc2: " + count + ", " + (t2 - t1) + "ms");
}
}
あなたの回答
tips
プレビュー