我注意到,当我使用条件断点进行调试时,执行速度会大大减慢。我知道这一点已经有一段时间了,现在想明白为什么。到底是什么原因导致执行如此缓慢?我知道正在添加一个条件,但是如果我自己添加条件,我不会减慢执行速度。
例如,假设我们有以下代码。假设我们添加了一个条件断点a=i
。让我们将条件设置为i==10000。
public class Main {
public static void main(String[] args) {
int a = 0;
for (int i = 0; i<100000; i++) {
a = i; //put breakpoint here (if i == 10000)
}
System.out.println("Done! a=" + a);
}
}
现在让我们自己写条件。
public class Main {
public static void main(String[] args) {
int a = 0;
for (int i = 0; i<100000; i++) {
if (i == 10000)
a = i; //put a NON-conditional breakpoint here
else a = i;
}
System.out.println("Done! a=" + a);
}
}
90秒完成击球(包括开始的9秒)
日食:
~9秒到达断点
第二个示例几乎是在所有IDE上即时运行的,所以我没有做实验。(但我确实运行了所有三个,看看是否有任何一个延迟,没有一个延迟。)
我还没有实现IDE、调试器或JVM,所以我不能确定事情是否正如我将在这里解释的那样进行。
但是。当代码使用调试器运行时,JVM将解释代码,直到它遇到断点。然后它停止并调用调试器(IDE)。
JVM不支持条件断点,所以IDE使用“hack”来实现这个特性。IDE只是添加一个普通断点。每次遇到断点时,IDE都会在通知用户之前对表达式本身进行计算,如果计算为false,则发送“continue”命令。
问题内容: 我使用jdi接口创建调试器,并且当我使用MethodEntryRequests启用方法条目跟踪调试程序时,速度降低了数十倍。我为主线程设置了过滤器,并将挂起策略设置为SUSPEND_EVENT_THREAD。Classfilter是有限的,如果我打印任何接收到的事件,它显示的事件不会超过几十个,因此不应接收太多事件。我在本地调试,并且在调试后的java程序中使用了以下命令行: 问题答案
问题内容: 这是所有编程语言所共有的吗?在进行多次打印后再执行println似乎更快,但是将所有内容移动到字符串中并仅进行打印似乎最快。为什么? 编辑:例如,Java可以在不到一秒钟的时间内找到所有高达100万的质数- 但要进行打印,然后在自己的println中将它们全部输出可能需要几分钟!最多可打印100亿小时! 例如: 问题答案: 速度并不慢,而是由主机操作系统提供的与控制台连接的基础。 您可
问题内容: 我对此感到困惑 现在让我们来看看numpy: 神圣的CPU周期蝙蝠侠! 使用改进,但恕我直言仍然不够 numpy.version.version =‘1.5.1’ 如果您想知道在第一个示例中是否跳过了列表创建以进行优化,则不是: 问题答案: Numpy已针对大量数据进行了优化。给它一个很小的3长度数组,毫不奇怪,它的性能很差。 考虑单独的测试 输出是 似乎是数组的归零一直花费在nump
问题内容: Magento通常这么慢吗? 这是我的第一次使用体验,管理面板只需花一些时间即可加载和保存更改。这是带有测试数据的默认安装。 托管该服务器的服务器可超快地服务于其他非Magento站点。Magento使它如此缓慢的PHP代码有什么用,该如何解决? 问题答案: 我只是切身参与优化Magento的性能,但这是系统速度如此缓慢的一些原因 Magento的某些部分使用在MySQL之上实现的EA
问题内容: 在有人质疑使用的事实之前,我先说一下,出于内存和性能的原因,我需要在特定的应用程序中使用它。[1] 因此,到目前为止,我一直使用并假定这是最有效的方法。但是,自古以来我就注意到它是软件的瓶颈。[2] 然后,就在最近,我试图用一个巨大的映射替换,在该映射中放置/获取字符串,以便每次获得唯一的实例。我以为这会慢一些…但是事实恰恰相反!它快得多了!通过推送/轮询地图(实现完全相同)来替换,可