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