web-dev-qa-db-ja.com

System.out.println()vs \ n in Java

5行印刷したいとしましょう。どちらが最良の方法です(パフォーマンスと読みやすさのために)。

System.out.println();
System.out.println();
System.out.println();
System.out.println();
System.out.println();

または

System.out.println("\n\n\n\n");

それは好みの問題ですか、それとも一方が他方より優れていますか。 2番目の方法を使用すると多くの時間を節約できるようです。

8
Will

2つの間に機能の違いがあります。最初のバージョンは、プラットフォームの優先行区切り文字を使用して改行を出力します。 2番目のバージョンは改行文字を出力しますが、これはWindowsまたはMacOSでは不適切である可能性があります。

これは、実際のまたは想像上のパフォーマンス上の利点よりも重要です。


パフォーマンスのトピックと、なぜ誰もが「もう十分」と言っているように見えるのかについて。

そのコードを記述する2つの方法のパフォーマンスの違いは、マイクロ秒数以下である可能性があります。言い換えれば、コードが何百万回も実行されない限り、エンドユーザーは違いに気付かないでしょう。

原則として、プロのソフトウェアエンジニアは、何かを速くする必要がない場合、何かを速くするために時間を費やす価値はないと考えています。そしてそれは確かにこれを行うためにクライアントのお金を使う価値がありません。

パフォーマンスの問題がある、またはそうなるという明確な証拠があり、最適化しようとしているコードが実際の問題がある/あるという明確な証拠がある場合にのみ、マイクロ最適化にふける必要があります。コードの間違ったビットを最適化するために費やされた時間は無駄な時間です。

では、最適化するためにいつをどのように知っていますか?

  • アプリケーションが観察可能実際に重要な基準に対して測定した場合に遅い場合。

そして、どのようにしてwhatを最適化するかを知っていますか?

  • アプリケーションプロファイラーを実行し、それらの出力を分析して、実際のパフォーマンスのホットスポットとボトルネックがどこにあるかを確認します。

パフォーマンスは必ずしも重要でない問題ではありません。実際、ある種のソフトウェアでは、パフォーマンスとスケーラビリティの要件を考慮しない設計または実装は、完全な災害になる可能性があります。ただし、ほとんどのソフトウェアはそのようなものではありません。

30
Stephen C

おそらくどちらよりも優れています:

System.out.printf("%n%n%n%n%n");

プラットフォームに適した行区切り文字を使用します。ここで、"\n"しません。

8
Ryan Stewart

2つ目は間違いなくコードが少なく、パフォーマンスの面では違いは見られないかもしれませんが、後者は1回の呼び出しであるため高速である可能性がありますが、無視できます。

0
Jesus Ramos

プラットフォームに依存する行区切り文字の場合、次を使用します。

String ls = System.getProperty("line.separator");
System.out.print(ls+ls+ls+ls+ls);

これは、win、linux、またはmacで機能するはずです。

0
Pablo Pazos

Println()を呼び出すたびにシステム関数が呼び出されるため、2番目のオプションはほぼ確実に高速です。このカーネルコードへのジャンプには、ある程度の時間がかかります。これが、Cでのバッファリングの背後にある理由です。

0
Maz

答えからわかるように、これは好みの問題です。あなたが与える例は、パフォーマンスの向上と読みやすさの問題が最小限である非常に単純なものです。ただし、より複雑なケースでは、一見同等の方法を使用することを選択すると、コードが機能しなくなったり、隣人に判読できなくなったりする可能性があります。

コードが乱雑になっているように見える場合は、乱雑なコードを抽象化して、読みやすいメソッド名を付けてみてください。

そうです、これは好みの問題です。

(編集:いいえ、これは明らかに好みの問題ではありません(^ o ^)//)

0
Ziggy