3

経過時間を測定する必要があるかどうかを知りたいのですが、それSingle Threaded Programは良いアプローチですか、それともMultithreading Programそのための良いアプローチです。

以下は私たちのサービスの時間を測定している私のシングルスレッドプログラムです-

private static void serviceCall() {

    histogram = new HashMap<Long, Long>();
    keys = histogram.keySet();
    long total = 5;
    long runs = total;

    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--;
    }

    for (Long key : keys) {
        Long value = histogram.get(key);
        System.out.println("MEASUREMENT " + key + ":" + value);
    }
}

このシングルスレッドプログラムから得られる出力は次のとおりです。5

MEASUREMENT 163:1
MEASUREMENT 42:3
MEASUREMENT 47:1

これは1、呼び出しが戻ってきたことを意味します163 ms3呼び出しが戻ってきた42 msなど。

またMultithreaded program、経過時間を測定するためにも使用してみました。少数のスレッドでサービスを並行してヒットし、各スレッドがどれだけの時間を取っているかを測定することを意味します。

以下はそのためのコードでもあります-

//create thread pool with given size 
    ExecutorService service = Executors.newFixedThreadPool(10);

// queue some tasks 
for (int i = 0; i < 1 * 5; i++) {
    service.submit(new ThreadTask(i, histogram));
}


public ThreadTask(int id, HashMap<Long, Long> histogram) {
    this.id = id;
    this.hg = histogram;
}


@Override
public void run() {

    long start_time = System.currentTimeMillis();

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

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

}

そして、以下は私が上記のプログラムから得た結果です-

{176=1, 213=1, 182=1, 136=1, 155=1}

1回の呼び出しが176ミリ秒で戻ってきました。

だから私の質問は、マルチスレッドプログラムが上記のシングルスレッドプログラムと比較してはるかに時間がかかるのはなぜですか?マルチスレッドプログラムに抜け穴がある場合、誰かがそれを改善するのを手伝ってくれますか?

4

1 に答える 1

3

マルチスレッドプログラムは、すべてのリクエストを同時に実行する可能性があります。これにより、サーバーに負担がかかり、すべてのリクエストへの応答が遅くなります。

余談ですが、更新を行う方法はスレッドセーフではないため、十分な試行回数があれば、マルチスレッドシナリオではカウントがオフになる可能性があります。

たとえば、スレッドAとスレッドBは両方とも100ミリ秒で同時に戻ります。100のヒストグラムのカウントは3です。Aは3を取得します。Bは3を取得します。Aは3から4を更新します。Bは3から4を更新します。Aはヒストグラムに値4を入れます。Bは値4をヒストグラムに入れます。これで、2つのスレッドがカウントをインクリメントしたと信じていますが、ヒストグラムのカウントは1回だけインクリメントされたことを反映しています。

于 2013-01-31T19:31:03.730 に答える