InputStream, преобразованный в String, учитывает высокую производительность - PullRequest
2 голосов
/ 07 октября 2019

Я создал Java-код rest-client и преобразовал XML-ответ в String. Я нашел три способа конвертировать этот ответ.

HttpURLConnection....
....
InputStream in = new GZIPInputStream(conn.getInputStream());

Gzip скрытый ответ в InputStream, используя строку выше. Затем я нашел следующие 3 метода для преобразования в строку.

1 Метод

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[4096];
int length = 0;
while ((length = in.read(buffer)) != -1) {
    baos.write(buffer, 0, length);
}

String response =new String(baos.toByteArray());

2 Метод

String response = "";
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String output;
while ((output = br.readLine()) != null) {
    response =output;
}

3 Метод

StringBuilder sb = new StringBuilder();
for (int c; (c = in.read()) >= 0;)
    sb.append((char) c);
String response = sb.toString();

Мне нужно знать, какой из способов лучше всего прочитать XML-ответ, учитывая высокую производительность / доступность (для сокращения времени ответа). Этот код будет использовать около 50-100 запросов в секунду с параллельным процессом. Пожалуйста, сообщите мне.

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Я выполнил свой код, используя Jemeter - Java Request , согласно статистике 1 Метод показывает лучшую производительность по сравнению с другими. Этот тест выполняется с реальным HTTP-вызовом и преобразует этот ответ в строку.

Метод 01 Успешно выполненное действие: ПОЛНОЕ: 1,339 сек., КОНВЕРТ: 0,001 сек

Метод 02 Успешно выполненное действие: ПОЛНОЕ: 1,502 сек., КОНВЕРТ: 0,021 Сек

Метод 03 Успешно выполненное действие: ПОЛНОЕ:1.709 сек., КОНВЕРТ: 0,015 Se

Код пляжной отметки здесь: - https://github.com/idthusitha/ride-test

1 голос
/ 07 октября 2019

Вот ваш ответ.

Я сделал простой код, который выполняет все тесты производительности для вас:

import java.util.*;
import java.io.*;
import java.time.format.DateTimeFormatter;
import java.time.LocalDateTime;

public class Main {
 public static void main(String[] args) throws Exception {
  // Your code here!
  String response = "";
  DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

  //STEP 1
  InputStream in = new ByteArrayInputStream("MYSTREAMASDasdasdSJKDFJASLKFJKSDLFJLKSADJFKSJDKAFJKSDJFLKSDJLKFJLKSDFJLKSDJLKLAKSDJLJKFSDKJADFSLJKLKJSDALJKALJKS adkaslkdajslkdjkaslkdjlaks\nasdasdasdasdasdasdasdasdasdasdasdasdasdas".getBytes());

  System.out.println("FIRST OPTION");
  long beginTime = System.nanoTime();
  //System.out.println("begin -" + beginTime);
  for (int i = 0; i < 500000; i++) {
   ByteArrayOutputStream baos = new ByteArrayOutputStream();
   byte[] buffer = new byte[4096];
   int length = 0;
   while ((length = in .read(buffer)) != -1) {
    baos.write(buffer, 0, length);
   }
   response = new String(baos.toByteArray());
  }
  long endTime = System.nanoTime();
  System.out.println(endTime - beginTime);

  //STEP 2
  System.out.println("SECOND OPTION");
  beginTime = System.nanoTime();
  for (int i = 0; i < 500000; i++) {
   response = "";
   BufferedReader br = new BufferedReader(new InputStreamReader( in ));
   String output;
   while ((output = br.readLine()) != null) {
    response = output;
   }
  }
  endTime = System.nanoTime();
  System.out.println(endTime - beginTime);

  System.out.println("THIRD OPTION");
  beginTime = System.nanoTime();
  for (int i = 0; i < 500000; i++) {
   StringBuilder sb = new StringBuilder();
   for (int c;
    (c = in .read()) >= 0;)
    sb.append((char) c);
   response = sb.toString();
  }
  endTime = System.nanoTime();
  System.out.println(endTime - beginTime);
 }
}

Здесь у вас есть результаты для выполнения цикла 500K:

  • ПЕРВЫЙ ВАРИАНТ 284684443 Миллисекунды
  • ВТОРОЙ ВАРИАНТ 1331922335 Миллисекунды
  • ТРЕТИЙ ВАРИАНТ 16031272 Миллисекунды

Как вы увидите, Третийздесь самый быстрый вариант.

Здесь - пример работы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...