0

現在、サービスのパフォーマンスを測定中です。だから私は私たちのサービスに電話をかけるURLを持っています。つまり、サービスに電話をかける前に時間を記録し、サービスから応答が戻った後、応答時間を測定します。私は自分のサービスを呼び出し、HashMapに数値を入れてパフォーマンスを測定するプログラムを作成しました-

    while (runs > 0) {

        long start_time = System.currentTimeMillis();
        result = restTemplate.getForObject("Some URL", String.class);
        long difference = (System.currentTimeMillis() - start_time);

        Long count = histogram.get(difference);
        if (count != null) {
            count++;
            histogram.put(Long.valueOf(difference), count);
        } else {
            histogram.put(Long.valueOf(difference), Long.valueOf(1L));
        }
        runs--;
    }

したがって、ヒストグラムマップから取得する出力は次のようになります-X number of calls came back in Y ms

今、一度に1つの電話をかけるのではなく、私が考えていたのは、以前のプログラムのように、サービスへの呼び出しを並列化する必要があるのではないかということです。そこで、サービスを同時に呼び出すマルチスレッドプログラムを以下に作成しました。それで、以下のプログラムは時差を正確に測定することができるでしょうか?

1つのスレッドがこれほど多くの時間を費やしているように、2番目のスレッドがこれほど多くの時間を費やしているように、3番目のスレッドがこれほど多くの時間を費やしているというように。これを行うことは可能ですか?

はいの場合、以下のプログラムがうまく機能しない場合、誰かがそれを行う方法を教えてもらえますか?

public static void main(String[] args) {

    ExecutorService service = Executors.newFixedThreadPool(10);

    for (int i = 0; i < 1 * 2; i++) {
        service.submit(new ThreadTask(i));
    }
    service.shutdown();
    try {
        service.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
    } catch (InterruptedException e) {

    }
}


class ThreadTask implements Runnable {
    private int id;
    private RestTemplate restTemplate = new RestTemplate();
    private String result;
    private HashMap<Long, Long> histogram;

    public ThreadTask(int id) {
        this.id = id;
    }

    @Override
    public void run() {

        long start_time = System.currentTimeMillis();

        result = restTemplate.getForObject("Some URL",String.class);
        long difference = (System.currentTimeMillis() - start_time);

        Long count = histogram.get(difference);
        if (count != null) {
            count++;
            histogram.put(Long.valueOf(difference), count);
        } else {
            histogram.put(Long.valueOf(difference), Long.valueOf(1L));
        }

        System.out.println(histogram);
    }
}

プログラムを実行するたびに、このマルチスレッドプログラムから取得する数値が非常に奇妙に見えるためです。

非マルチスレッドプログラムから取得した出力

168=1
41=1
43=3

1 call came back in 168 ms等々...

そして、マルチスレッドプログラムから得た出力

{119=1}
{179=1}
{150=1}
{202=1}
{149=1}

1 call came back in 119 msなど...マルチスレッドプログラムでは、もっと時間がかかると思いますか?

4

2 に答える 2

0

変な数字を取得することの意味がわかりません。私の大げさな推測は、異なるスレッドからの出力が散在しているためだと思います。

これを解決する1つの方法はhistogramrunメソッドからをまったく出力しないことです。これはすでにインスタンス変数であるため(現在はそうである必要はありませんが)、次のことができます。

  1. 名前のないインスタンスを送信する代わりに、ThreadTaskそれらをリスト/配列に格納します。

  2. ThreadTask.reportを印刷するメソッドを作成しますhistogram

  3. すべてのスレッドが完了したら、ThreadTask.reportそれぞれを順番に呼び出します。

于 2013-01-31T02:36:32.677 に答える
0

あなたは同じ時間を何度も説明していると思います。スレッドが同期ブロック内でコードのこの部分を実行しない場合:

long start_time = System.currentTimeMillis();

result = restTemplate.getForObject("Some URL",String.class);
long difference = (System.currentTimeMillis() - start_time);

次に、これが発生する可能性があります。

  1. スレッド1:長いstart_time..。
  2. スレッド1:結果=..。
  3. スレッド2:長いstart_time..。
  4. スレッド2:結果=..。
  5. スレッド2:長い違い..。
  6. スレッド1:長い違い..。

したがって、あなたの会計は正しく機能しません。スレッド環境でのタイミング機能については、同期ブロックを使用するか、Java java.lang.managementThreadMXBeanおよびなど)を調べることができます。ThreadInfo

アップデート:

問題の詳細と回避方法については、この関連するSOの質問への回答も参照してください。

于 2013-11-05T22:32:00.513 に答える