架构师训练营第 07 周——练习
发布于: 2020 年 07 月 21 日
用你熟悉的编程语言写一个 web 性能压测工具,输入参数:URL,请求总次数,并发数。输出参数:平均响应时间,95% 响应时间。用这个测试工具以 10 并发、100 次请求压测 www.baidu.com。
import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;import java.util.ArrayList;import java.util.Collections;import java.util.List;import java.util.concurrent.CountDownLatch;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;public class Test { public static void main(String[] args) { // 请求的URL String url = "https://www.baidu.com/"; // 并发数量 int curr = 10; // 单个线程请求数量 int reqCount = 10; // 保存访问时间 List<Long> times = new ArrayList<>(); CountDownLatch latch = new CountDownLatch(curr); ThreadPoolExecutor executor = new ThreadPoolExecutor(curr, curr, 1, TimeUnit.SECONDS, new LinkedBlockingQueue<>(1)); try { for (int i = 0; i < curr; i++) { executor.execute(() -> { for (int j = 0; j < reqCount; j++) { // 记录开始时间 long time = System.currentTimeMillis(); try { HttpClient client = HttpClient.newBuilder().build(); HttpRequest request = HttpRequest.newBuilder(new URI(url)).GET().version(HttpClient.Version.HTTP_1_1).build(); // 发送get请求 client.send(request, HttpResponse.BodyHandlers.ofString()); } catch (URISyntaxException | IOException | InterruptedException e) { e.printStackTrace(); } times.add(System.currentTimeMillis() - time); } latch.countDown(); }); } latch.await(); //输出平均响应时间 System.out.println(times.stream().mapToDouble(Double::valueOf).average().orElse(0)); //输出95%响应时间 Collections.sort(times); System.out.println(times.get((int)Math.ceil(0.95*times.size()))); } catch (InterruptedException e) { e.printStackTrace(); } finally { executor.shutdown(); } }}
划线
评论
复制
发布于: 2020 年 07 月 21 日阅读数: 61
李伟
关注
还未添加个人签名 2018.05.07 加入
还未添加个人简介
评论