1

Y. Daniel Liangによる「Javaプログラミング入門:包括的なバージョン」の第4章の終わりに、いくつかのプログラミング演習を行っています。質問4.18で、私は2つの異なる解決策を思いつきました。

どのソリューション(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までを印刷することであると仮定すると、2つの間に何かを入れます。ここで、すべての数値は出力に含まれるものです。

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

カウンターは常に<=6であるため、<=6であるために追加のチェックを行う必要はありませんcounter2

また、私の経験では、ほとんどの場合、[0、n)の範囲の数値が必要であることに注意してください。ここでの[1、n]の要件は比較的まれです。もちろん、それはあなたが何をしているかにもよるが、あなたは範囲を表現する自然な方法を考えるべきである。自然な傾向が上限を含むようにすることである場合は、<=;を使用します。自然な傾向が上限を排他的にすることである場合は、を使用します<

于 2012-07-04T22:28:16.377 に答える
6

答えはそれは問題ではないということです。JVMはすでにコードを最適化しており、このような些細な違いのために、とにかく同じ命令を生成することになります。さらに、最適化は非常に複雑な問題であり、コードを見て、より高速であると言うことはできません。実際のパフォーマンスは、プロセッサのキャッシュ動作など、多くの隠れたものに依存します。最後に、そもそもこの種の最適化を試みるべきではありません。測定可能なパフォーマンスの問題があるボトルネックを見つけない限り、気にしないでください。プロファイル、プロファイル、プロファイル。

于 2012-07-04T22:35:00.957 に答える