我想知道我是否需要测量经过的时间,然后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}
一个电话在176毫秒内恢复,依此类推
所以我的问题是为什么多线程程序与上面的单线程程序相比需要花费更多的时间?如果我的多线程程序中存在一些循环漏洞,有人可以帮我改进它吗?
答案 0 :(得分:2)
您的多线程程序可能会同时发出所有请求,这会给服务器带来更多压力,从而导致它对所有请求的响应速度变慢。
顺便说一句,你进行更新的方式并不是线程安全的,所以在多线程场景中,如果有足够的试验,你的计数可能会被取消。
例如,线程A和B都在100毫秒内同时返回。 100的直方图中的计数为3. A得到3. B得到3. A更新3到4. B更新3到4. A将值4放在直方图中。 B将值4放在直方图中。你现在有2个线程认为它们增加了计数,但直方图中的计数只反映了增加一次。