Попробуйте с проблемами производительности ресурсов - PullRequest
0 голосов
/ 10 июля 2020

Из недавнего обзора кода коллега предложил использовать «Попробуйте с оператором ресурсов». Поэтому я погуглил и изменил свой код.

Я тестирую CSV на 600 строк, используя ожидаемые результаты от API в Java 11. Итак, для каждой строки CSV я делаю запрос на получение. После внесения изменений я обнаружил, что мои тесты занимают на ± 30% (в зависимости от ответа API) больше времени. Я обнаружил проблему, но не понимаю, почему это происходит.

Это код перед MR:

 public static String getApiResponseBody(HttpURLConnection con) throws IOException {
    String inputLine = null;
    BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()));
    try {
        inputLine = in.readLine();
        in.close();
        con.disconnect();
    } catch (IOException e) {
        error.error("Can't get API response! " + e);
    }
    return inputLine;
}

До изменений

Код с «попробуйте с ресурсами»:

public static String getApiResponseBody(HttpURLConnection con) {
        String inputLine = null;
        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()))) {
            inputLine = in.readLine();
            con.disconnect();
        } catch (IOException e) {
            error.error("Can't get API response! " + e);
        }
        return inputLine;
    }

попробуйте с ресурсами

Вот как я исправил проблемы с производительностью:

public static String getApiResponseBody(HttpURLConnection con) {
    String inputLine = null;
    try (BufferedReader in = new BufferedReader(
            new InputStreamReader(con.getInputStream()))) {
        inputLine = in.readLine();
        *in.close();*
        con.disconnect();
    } catch (IOException e) {
        error.error("Can't get API response! " + e);
    }
    return inputLine;
}

закрытие BufferedReader при попытке с ресурсами

Итак, читая все, BufferedReader реализует Closable, поэтому нет необходимости закрывать его, если используется «попытка с ресурсами». Кроме того, когда я использовал блок «окончательный захват лотка», Intellij предложил заменить его на «попробовать с ресурсами» и автоматически удалил in.close (); . Очень хотелось бы понять, что здесь происходит. Эта проблема производительности не так важна для 600 строк, но мне нужно расширить мои тесты до 500 тыс. Строк, поэтому разница составляет ± 30%. Спасибо!

...