Java - url.openConnection () и httpsUrlConnection.connect () работает медленно при первом вызове - PullRequest
0 голосов
/ 14 октября 2018

Я обнаружил интересное явление при написании программ на Java.

Я создал 3 https-подключения к 3 различным URL-адресам и обнаружил, что при вызове url.openConnection() и httpsUrlConnection.connect() для FIRST раз, они потребовали почти 300ms и 1s для выполнения соответственно, в то время как во время второго и третьего вызова они взяли почти 0ms.

Есть ли причины для такой разницы в производительности?

Кстати, есть ли что-то, что я могу сделать, чтобы улучшить производительность?

К вашему сведению, все три httpsURLConnection выглядят так (try-catch не отображается):

Url url = new URL("https://www.google.com");
Utils.logTime(logger);
HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
Utils.logTime(logger);
httpsURLConnection.setRequestMethod("GET");
httpsURLConnection.setConnectTimeout(5 * 1000);
httpsURLConnection.setReadTimeout(5 * 1000);
httpsURLConnection.setRequestProperty(Utils.ACCEPT, Utils.ACCEPT_ALL);
httpsURLConnection.setRequestProperty(Utils.ACCEPT_ENCODING, Utils.GZIP);
httpsURLConnection.setRequestProperty(Utils.USER_AGENT, Utils.MOZILLA);
Utils.addCookiesToConnection(httpsURLConnection, cookieMap);
Utils.logTime(logger);
httpsURLConnection.connect();
Utils.logTime(logger);

И, как вы можете предположить, Utils и cookieMap - это класс и HashMap, созданные мной, поэтому они не должны быть в центре внимания решения.

Есть идеи?Заранее спасибо.

1 Ответ

0 голосов
/ 14 октября 2018

Причиной разницы во времени может быть следующее: в первый раз необходимо установить сокетное соединение (от исходного ip до целевого ip и порта).После того, как установлено, то же самое соединение TCP может быть повторно использовано.Это нормально в сетевом программировании.

Для повышения эффективности и большего контроля над пулами соединений, я бы предложил рассмотреть Apache HttpClient

...