当前位置: 首页 > 知识库问答 >
问题:

中断语句导致执行速度变慢?

乜坚成
2023-03-14

好的,我在Eclipse Neon中开发一个游戏,我注意到当我在程序中添加了一个break语句时,程序的速度从大约120 fps降低到了80 fps(这没有什么意义)。所以我决定在另一个班级进行测试,得到了相似的结果。

这是我运行的代码:

public static int[] xArray = new int[100000];
public static int[] yArray = new int[10000];

public static void main(String[] args){

    long timeStart = System.currentTimeMillis();

    int numberOfLoops = 0;
    int uboveMax = 0;

    for(int x = 0; x < xArray.length; x++){
        for(int y = 0; y < yArray.length; y++){
            numberOfLoops++;
            if(y > 9000){
                uboveMax++;
                //break;
            }
        }
    }

    long timeTaken = System.currentTimeMillis();

    System.out.println("Number of Loops: " + numberOfLoops);
    System.out.println("Ubove Max: " + uboveMax);
    System.out.println("Time Taken(MS): " + (timeTaken - timeStart));

}

所以当我运行代码时(在Eclipse Neon 2 (4.6.2))我得到了意想不到的结果:

使用中断语句:耗时(MS):344.8(5次测试的平均值)

无中断声明:所用时间(MS):294.6(5次测试的平均值)

然后,当我运行代码(在 NetBeans IDE 8.2 中)时,我得到了预期的结果:

使用break语句:所用时间(毫秒):4.2(5次测试的平均值)

不带中断语句: 所需时间(MS): 556.8 (5 次测试的平均值)

带有 break 语句的代码(在 Eclipse 中)难道不应该以相同的速度运行,如果不是更快的话?另外,Eclipse和NetBeans之间出现巨大差异的原因是什么,我知道它们是非常不同的程序,但是不要都从同一个JVM运行代码,他们的Eclipse编译器有什么问题吗?如果有人能为这种情况提供解释,那就太好了,谢谢!

共有1个答案

匡凌
2023-03-14

这应该是一个评论,但它太长了。你的代码的问题在于它所做的事情等同于

System.out.println("Number of Loops: " + 1000000000);
System.out.println("Ubove Max: " + 99900000);

这可以优化到几个周期。这不会发生,因为你没有给JVM足够的时间和/或因为OSR(见这个问题的一个很好的例子)。

您的代码(没有< code>break)可以优化

for(int x = 0; x < xArray.length; x++) {
    numberOfLoops += yArray.length;
    uboveMax += Math.max(0, yArray.length - 9001);
}

进一步到

numberOfLoops += xArray.length * yArray.length;
uboveMax += xArray.length * Math.max(0, yArray.length - 9001);

使用 break 的代码将导致类似的表达式。如果我是JVM,我会对你在这种无意义上浪费时间感到不安。JVM不会感到不安,如果你给它一个机会,你会看到在这两种情况下的时间接近于零。这是可能的,但不太可能,(即使有足够的时间)其中一种情况没有像另一种情况那样得到优化,但这并不重要,只是有无数的优化可能性,并且在某些情况下,JVM错过了一些东西。

恕我直言,此示例不会让您深入了解为什么实际代码会发生减速。简化代码以找到问题是好的,但你走得太远了。实际上,您的变量会做一些事情,并且可能会影响未来的计算,以便打破循环的情况是将来需要做更多的工作。只是猜测,但是没有真正的代码还有什么呢?

 类似资料:
  • 我写了以下代码: 演示 JLS 14.10说: 当且仅当主机系统已确定词汇上包含assert语句的顶级类启用断言时,才会启用在其类完成初始化后执行的assert语句。 我以为我在类中通过assert true启用了断言,但它仍然不起作用。我如何才能启用关于所说内容的断言?

  • 问题内容: 在最新的Java和Eclipse稳定发行版(Kempler)中,假设存在程序包和类名称,请输入以下代码并执行该代码: 这将打印值4。最初,我认为应该打印2,因为我认为即使没有break语句,每段代码仍保留在case语句中。现在,我认为问题在于如何编译。例如,我目前的信念是在内部使用布尔值来跟踪case语句是否等于该值。如果是,则布尔值为true,并且 所有case语句将被视为true,

  • 我在程序(计时器类)中使用scheduleAtFixedRate方法。它每秒钟运行一次,但有时这种方法会变得非常快(每秒执行3-4次)。 然而,我在网上做了一些研究,发现了这个: 复制自android开发者页面: 对于固定速率执行,任务每次连续运行的开始时间都是计划的,而不考虑上一次运行的时间。如果延迟阻止计时器按时启动任务,则这可能会导致一系列串接运行(一个接一个地启动)。 我需要固定的计时器。

  • 问题内容: 大家好,我想执行我的SQL语句,但是我在synatx上遇到麻烦,有人可以帮助我了解我做错了什么吗? 谢谢,阿什。 问题答案: 您需要解决的最重要的事情是使用查询参数,而不是动态地构建字符串。这将提高性能,维护和安全性。 此外,您想使用较新的强类型ADO.Net对象。确保为添加使用指令。 注意此代码中的语句。完成连接后,他们将 确保 您的连接已关闭。这很重要,因为数据库连接是有限且不受管

  • 问题内容: 我一直在使用HTMLUnit。非常适合我的要求。但这似乎非常缓慢。例如:我已经使用HTMLUnit自动化了以下场景 代码: 它运作良好100%。但是需要3分41秒 我想执行缓慢的原因是要验证页面上的每个元素。 我的问题是如何减少HTMLUnit的执行时间?有什么方法可以禁用网页上的验证。 提前致谢! 问题答案: 对于当前的htmlUnit 2.13,设置选项与maxmax提供的设置略有

  • 问题内容: 我在Hibernate尝试了简单的程序,并发现了一堆异常。 我不知道到底是什么问题。 我有三个课程-书籍,阅读器和使用。最后一个是将前两个绑定为一对多。 这是我的: 这是异常消息: 的摘要: DB上的所有表均已创建,但为空。一切都还好。有什么建议么? 如何解决这个麻烦? 问题答案: 在MySQL中, USING 是保留字。 因此,只需使用实体上的注释来重命名表即可。就像是 我假设您有一