为什么在Java中调试(单步切换)时https连接如此缓慢?

为什么在Java中调试(单步切换)时https连接如此缓慢?,java,eclipse,debugging,networking,Java,Eclipse,Debugging,Networking,我试图调试我的Java代码中的一些问题,它建立了http/https连接。我想知道为什么调试时连接速度会慢得离谱(下载一个小网页需要一分钟以上),即使是跨过网络工作的方法。如果有什么补救办法 下面我发布了一个示例(您可以将https:更改为http:,并尝试在Eclipse中按F11)调试此操作-对于单步执行,在第一个main()语句中放置一个断点,并在其暂停时按F6 我的结果(以毫秒为单位的时间): 编辑:在禁用步骤操作后显示方法结果选项(霍尔格的答案恰当地建议了补救方法)后,时间变得更加合

我试图调试我的Java代码中的一些问题,它建立了http/https连接。我想知道为什么调试时连接速度会慢得离谱(下载一个小网页需要一分钟以上),即使是跨过网络工作的方法。如果有什么补救办法

下面我发布了一个示例(您可以将
https:
更改为
http:
,并尝试在Eclipse中按
F11
)调试此操作-对于单步执行,在第一个
main()
语句中放置一个断点,并在其暂停时按
F6

我的结果(以毫秒为单位的时间):


编辑:在禁用
步骤操作后显示方法结果
选项(霍尔格的答案恰当地建议了补救方法)后,时间变得更加合理(https大约为十分之一)


我的场景:Java8(1.8.0_121-b13),64位,Win-7,Eclipse光子(也有氧气体验)

import java.io.*;
导入java.net。*;
导入java.nio.charset.StandardCharset;
公共类TestConn{
公共静态void downloadFromUrl(最终URL)引发IOException{
长t0=System.currentTimeMillis();
URLConnection conn=url.openConnection();
System.out.println(“连接毫秒:”+
(System.currentTimeMillis()-t0)+“url=“+url”);
System.out.println(“======================================================================”);
try(BufferedReader in=新的BufferedReader(
新的InputStreamReader(conn.getInputStream(),StandardCharsets.UTF_8))){
弦线;
int cont=0;
而((line=in.readLine())!=null){
if(cont++<4)
系统输出打印项次(行);
} 
如果(续>=4)
System.out.printf(“==行总数:%d(%d跳过)\n”,续,续-4);
System.out.println(“===============================================================================”);
} 
}
公共静态void testConn(字符串URL){
试一试{
长t0=System.currentTimeMillis();
下载自URL(新URL(URL));
System.out.println(“完成,总时间毫秒:”+
(System.currentTimeMillis()-t0));
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args)引发异常{
测试控制(“https://www.example.com/“”;//此处为断点,用F6跳过
System.out.println(“再见”);
}
}
这就是为什么在窗口>首选项:Java>调试中有首选项在步骤操作后显示方法结果(如果VM支持;可能很慢)

自Eclipse 2018-09(4.9)以来,可以设置超时(默认为7秒):


你并不是在衡量你认为自己是什么。一旦建立了连接,套接字就会保持打开状态;因此它只需要连接一次。根据测试的顺序,第一次测试的速度会很慢。之后的一切都会很快。也就是说,你的调试器不是导致速度减慢的根本原因。@ElliottFrisch:My measures是在不同的运行中完成的,因此它们是不同的JVM实例,没有套接字重用的机会。此外,我的结果不取决于顺序。在任何情况下,87秒下载一个网页,即使是从最冷的状态下载,也是荒谬的。1)当您连接调试代理并设置断点时,JVM会对代码进行去优化。这可能会使速度慢得多。2) 我怀疑Java团队在调试代码时是否投入了大量精力使代码快速运行。为什么?因为大多数Java用户都不关心,把开发精力花在人们不关心的事情上是不好的工程。3) “荒谬”是你的观点。“荒谬”没有科学的衡量标准。4)如果你真的在乎。。。。然后下载OpenJDK并开始研究JVM,以找出这一速度慢的原因。找到原因后,开发修补程序来修复它们,并以标准方式将它们提交给OpenJDK团队。除4)之外,没有补救措施。这是很有用的。谢谢
                        conn time   total time
http  (not stepping)        60           350
http  (stepping over)     1100          1500
https (not stepping)       570          1300
https (stepping over)    21000         83000
http  (stepping over 2)     150           450
https (stepping over 2)    2000          7000
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");
    }
}