経過時間を測定する必要があるかどうかを知りたいのですが、それ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 ms
。3
呼び出しが戻ってきた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ミリ秒で戻ってきました。
だから私の質問は、マルチスレッドプログラムが上記のシングルスレッドプログラムと比較してはるかに時間がかかるのはなぜですか?マルチスレッドプログラムに抜け穴がある場合、誰かがそれを改善するのを手伝ってくれますか?