1

在 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();
        }
    }
}
4

2 回答 2

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();
}

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

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

于 2012-07-04T22:28:16.377 回答
6

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

于 2012-07-04T22:35:00.957 回答