Почему соединения HTTPS так медленны при отладке (перешагивании) в Java? - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь отладить некоторые проблемы с моим 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");
    }
}

1 Ответ

0 голосов
/ 11 ноября 2018

Именно поэтому в Окно> Предпочтения: Java> Отладка есть предпочтение Показывать результат метода после операции шага (если поддерживается ВМ; возможно медленный) .

Начиная с Eclipse 2018-09 (4.9) для этого можно установить тайм-аут (7 секунд по умолчанию):

...