質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.44%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

0回答

1206閲覧

内部マップをMap<I,O>から、Map<I,Myfuture<O>>に改良するときにエラーをなくしたい

numame

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/11/04 06:01

編集2021/11/04 06:04

以下のように、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");

}
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/11/04 10:50

「どのようになることを想定していた」のが「実際にはどうなっている」のですか?
numame

2021/11/05 04:58 編集

想定では、 > java MemoConcTest3 memo: 1389632, 3151ms memo conc1: 1389632, 5412ms memo conc2: 1389632, 3525ms memo conc3: 1389632, 3000ms  を目指していたのですが、 実際は、 > java MemoConcTest3 memo: 1389632, 3151ms memo conc1: 1389632, 5412ms memo conc2: 1389632, 3525ms memo conc3: 1389632, 3866ms とConc3になると時間がかかってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.44%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問