gpt4 book ai didi

java - 单线程程序与多线程程序(测量耗时)

转载 作者:行者123 更新时间:2023-11-30 04:31:07 24 4
gpt4 key购买 nike

我想知道我是否需要测量耗时,那么单线程程序是一个好方法,或者多线程程序是一个好方法。

下面是我的单线程程序,它正在测量我们的服务时间-

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毫秒内返回。 3 次调用在 42 毫秒 内返回,依此类推。

我也尝试使用多线程程序来测量耗时。这意味着用很少的线程并行地访问服务,然后测量每个线程占用的时间。

下面是代码 -

//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 毫秒内返回,依此类推

所以我的问题是为什么多线程程序比上面的单线程程序花费更多的时间?如果我的多线程程序中有一些漏洞,有人可以帮助我改进它吗?

最佳答案

您的多线程程序可能会同时发出所有请求,这会给服务器带来更大的压力,从而导致服务器对所有请求的响应速度变慢。

顺便说一句,您进行更新的方式不是线程安全的,因此如果经过足够的试验,您的计数可能会在多线程场景中关闭。

例如,线程A和B都在100毫秒内同时返回。 100 的直方图中的计数为 3。A 获取 3。B 获取 3。A 将 3 更新为 4。B 将 3 更新为 4。A 将值 4 放入直方图中。 B 将值 4 放入直方图中。现在,您有 2 个线程相信它们增加了计数,但直方图中的计数仅反射(reflect)增加了一次。

关于java - 单线程程序与多线程程序(测量耗时),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14633587/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com