Я пытаюсь отладить некоторые проблемы с моим Java-кодом, который устанавливает соединение http / https. Мне интересно, почему при отладке соединение становится смехотворно медленным (более одной минуты для загрузки небольшой веб-страницы), даже при переходе от метода, который работает в сети. И если есть какое-то лекарство.
Ниже я публикую пример (вы можете изменить https:
на http:
и попробовать отладить его с помощью Eclipse, нажав F11
- для пошагового перехода, установите точку останова в первом операторе main()
и нажмите F6
когда он останавливается там.
Мои результаты (время в миллисекундах):
conn time total time
http (not stepping) 60 350
http (stepping over) 1100 1500
https (not stepping) 570 1300
https (stepping over) 21000 83000
Редактировать: после отключения опции Show method result after a step operation
(средство, метко предложенное в ответе Хоулгера), времена становятся на намного более разумными (примерно на одну десятую для https).
http (stepping over 2) 150 450
https (stepping over 2) 2000 7000
Мой сценарий: Java 8 (1.8.0_121-b13), 64 бита, Win-7, Eclipse Photon (также опыт работы с кислородом).
import java.io.*;
import java.net.*;
import java.nio.charset.StandardCharsets;
public class TestConn {
public static void downloadFromUrl(final URL url) throws IOException {
long t0 = System.currentTimeMillis();
URLConnection conn = url.openConnection();
System.out.println("conn msecs: " +
(System.currentTimeMillis() - t0) + " url=" + url);
System.out.println("=====================================");
try (BufferedReader in = new BufferedReader(
new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
String line;
int cont = 0;
while ((line = in.readLine()) != null) {
if (cont++ < 4)
System.out.println(line);
}
if(cont >=4)
System.out.printf("== total lines: %d (%d skipped)\n",cont,cont-4);
System.out.println("==============done=======================");
}
}
public static void testConn(String urls) {
try {
long t0 = System.currentTimeMillis();
downloadFromUrl(new URL(urls));
System.out.println("Done , total time msecs: " +
(System.currentTimeMillis() - t0));
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
testConn("https://www.example.com/"); // breakpoint here, step-over with F6
System.out.println("bye");
}
}