首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >当从未执行的代码被注释掉时,Java程序的运行速度会变慢

当从未执行的代码被注释掉时,Java程序的运行速度会变慢
EN

Stack Overflow用户
提问于 2017-01-01 02:21:19
回答 1查看 4.7K关注 0票数 57

我在我的一个Java程序中观察到一些奇怪的行为。我已经尝试尽可能地精简代码,同时仍然能够复制行为。下面是完整的代码。

代码语言:javascript
复制
public class StrangeBehaviour {

    static boolean recursionFlag = true;

    public static void main(String[] args) {
        long startTime = System.nanoTime();
        for (int i = 0; i < 10000; i ++) {
            functionA(6, 0);
        }
        long endTime = System.nanoTime();
        System.out.format("%.2f seconds elapsed.\n", (endTime - startTime) / 1000.0 / 1000 / 1000);
    }

    static boolean functionA(int recursionDepth, int recursionSwitch) {
        if (recursionDepth == 0) { return true; }
        return functionB(recursionDepth, recursionSwitch);
    }

    static boolean functionB(int recursionDepth, int recursionSwitch) {
        for (int i = 0; i < 16; i++) {
            if (StrangeBehaviour.recursionFlag) {
                if (recursionSwitch == 0) {
                    if (functionA(recursionDepth - 1, 1 - recursionSwitch)) return true;
                } else {
                    if (!functionA(recursionDepth - 1, 1 - recursionSwitch)) return false;
                }
            } else {
                // This block is never entered into.
                // Yet commenting out one of the lines below makes the program run slower!
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
                System.out.println("...");
            }
        }
        return false;
    }
}

我有两个函数,functionA()functionB(),它们以递归方式相互调用。这两个函数都有一个控制递归终止的recursionDepth参数。functionA()recursionDepth不变的情况下最多调用functionB()一次。functionB()使用recursionDepth - 1调用functionA() 16次。当使用0recursionDepth调用functionA()时,递归终止。

functionB()有一个包含多个System.out.println()调用的代码块。此块从不进入,因为条目由设置为trueboolean recursionFlag变量控制,并且在程序执行期间不会更改。但是,注释掉其中的一个println()调用都会导致程序运行速度变慢。在我的机器上,在所有println()调用都存在的情况下,执行时间<0.2秒,当其中一个调用被注释掉时,执行时间>2秒。

是什么导致了这种行为?我唯一的猜测是,有一些天真的编译器优化是由一个与代码块长度(或函数调用次数等)相关的参数触发的。如果您对此有进一步的了解,我们将不胜感激!

编辑:我使用的是JDK 1.8。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41410743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档