哪个代码更有效?为什么?

时间:2012-07-04 22:26:11

标签: java performance

我在Y. Daniel Liang的“Java编程简介:综合版本”的第四章末尾做了一些编程练习。在问题4.18中,我提出了两种不同的解决方案。

哪种解决方案(PatternLoop1或PatternLoop2)更有效,为什么?

public class PatternLoop1 {
    public static void main(String[] args) {
        for (int counter = 0; counter < 6; ++counter) {
            for (int counter2 = 0; counter2 <= counter; ++counter2) {
                System.out.print(counter2 + 1);
            }
            System.out.println();
        }
    }
}


public class PatternLoop2 {
    public static void main(String[] args) {
        for (int counter = 1; counter < 7; counter++) {
            for (int counter2 = 1; counter2 < 7 && counter2 <= counter; counter2++) {
                System.out.print(counter2);
            }
            System.out.println();
        }
    }
}

2 个答案:

答案 0 :(得分:7)

编辑:之前我没有注意到code-efficiency标签。下面的答案是关于有效解决方案的方式 - 并且代码的有效性包括它的可读性,IMO。 (这就是它如何有效地表达其目标。)效率的差异将是无法估量的。

假设目标是打印1,然后是1 2,然后是123 ...直到123456,我会选择两者之间的东西,其中所有数字都是输出中涉及的数字

for (int counter = 1; counter <= 6; counter++) {
    for (int counter2 = 1; counter2 <= counter; counter2++) {
        System.out.print(counter2);
    }
    System.out.println();
}

请注意,计数器始终为&lt; = 6,因此我们无需额外检查counter2是否为<= 6。

另请注意,根据我的经验,大多数我们需要[0,n]范围内的数字 - 这里的[1,n]要求相对较少。当然这取决于你正在做什么,但你应该想到自然表达范围的方式。如果自然倾向是使上限包含,则使用<=;如果自然倾向是使上限独占,请使用<

答案 1 :(得分:6)

答案是没关系。 JVM已经优化了代码,并且对于像这样的微不足道的差异,它可能最终会产生相同的指令。此外,优化是一个非常复杂的问题,你不能只看代码并说它更快。实际性能取决于很多隐藏的东西,比如处理器的缓存行为。最后,您不应该首先尝试进行这种优化。除非您发现存在可测量性能问题的瓶颈,否则不要打扰。个人资料,个人资料,个人资料。