Я работаю над проектом, в котором я пытаюсь сделать вызов URL-адреса на один из моих серверов, используя RestTemplate
, который возвращает мне строку JSON в качестве ответа, и он работает нормально...
Теперь я решил провести некоторые тесты производительности на этом...
Ниже мой код, который использует ExecutorService
и Callables
-
public class URLTest {
private ExecutorService executor = Executors.newFixedThreadPool(10);
public String getData() {
Future<String> future = executor.submit(new Task());
String response = null;
try {
System.out.println("Started..");
response = future.get(200, TimeUnit.MILLISECONDS);
System.out.println("Finished!");
} catch (TimeoutException e) {
System.out.println("Terminated!");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
return response;
}
}
Ниже мой класс Task, который реализует интерфейс Callable -
class Task implements Callable<String> {
private RestTemplate restTemplate = new RestTemplate();
public String call() throws Exception {
String url = "some_url";
// TimerTest timer = TimerTest.getInstance(); // line 3
String response = restTemplate.getForObject(url, String.class);
// timer.getDuration(); // line 4
System.out.println(response);
return response;
}
}
А ниже мой код в другом классе DemoTest
, который вызывает метод getData
в классе URLTest
500 times
и измеряет его 95-й процентиль, поскольку это то, что мне нужно сделать -
public class DemoTest {
public static void main(String[] args) {
URLTest bc = new URLTest();
for (int i = 0; i <= 500; i++) {
TimerTest timer = TimerTest.getInstance(); // line 1
bc.getData();
timer.getDuration(); // line 2
}
// this method prints out the 95th percentile
logPercentileInfo();
}
}
С приведенным выше кодом я всегда вижу 95-й процентиль как 14-15 ms
(что плохо для моего варианта использования, поскольку это сквозной поток, и это то, что мне нужно измерить), но если я закомментирую line 1
и line 2
в классе DemoTest
и раскомментируйте line 3
и line 4
в классе Task
, а затем снова запустите программу, она начнет давать мне 95-й процентиль как 3 ms
.
удивляюсь почему? ExectuorFramework
добавляет сюда всю задержку? И почему, если я просто измеряю производительность вызова RestTemplate
, она всегда дает мне более высокую производительность по сравнению со сквозной производительностью?
Моя главная цель - максимально уменьшить задержку здесь. Мой вариант использования прост: сделать вызов URL-адреса на один из моих серверов с включенной функцией TIMEOUT, что означает, что если серверу требуется много времени для ответа, то тайм-аут весь звонок.
И моя клиентская программа, и сервер работают в PRODUCTION в одном и том же центре обработки данных, поэтому время пинга составляет около 0,5 мс.
Я запускал пару раз, чтобы сделать этот тест, и все тот же результат.
Есть ли что-то, что мне не хватает, или какие-то другие варианты ExecutorService
, которые мне нужно использовать? Как я могу улучшить свою работу здесь? Любые предложения будут очень полезны ..
ОБНОВЛЕНИЕ:-
Добавлено время прогрева -
public static void main(String[] args) {
URLTest bc = new URLTest();
// little bit warmup
for (int i = 0; i <= 500; i++) {
bc.getData();
}
for (int i = 0; i <= 500; i++) {
TimerTest timer = TimerTest.getInstance();
bc.getData();
timer.getDuration();
}
logPercentileInfo();
}