現在、サービスのパフォーマンスを測定中です。だから私は私たちのサービスに電話をかける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
など...マルチスレッドプログラムでは、もっと時間がかかると思いますか?