文系プログラマーのプログラミング備忘録

Java、競プロ、数学などについて書いてます

System.out.println() は遅い?

競技プログラミングでは System.out.println() を使って解答を出力しますが、出力回数が数万・数十万回に及ぶような場合、実行時間がかかりすぎてしまうことがあるみたいです。例えば、以下のような問題です。


atcoder.jp


この問題では Yes/No の出力を最大で10万回実行する必要があります。実際にSystem.out.println() で1回ずつ Yes/No を出力していくプログラムを作成し、提出してみた結果がこちらです。


提出:https://atcoder.jp/contests/code-festival-2016-qualb/submissions/4229884
f:id:YukiMoto:20190211153740j:plain


結果は656ms。制限時間が2000msなのである程度の余裕はありますが、少し怖いですね。


実行速度を速める方法として、StringBuilderで10万回ぶんの Yes/No(+改行) を1つの文字列に結合し、1回の System.out.println() でまとめて出力する、という方法があります。実際にその方法でプログラムを作成し、提出してみると……


提出:https://atcoder.jp/contests/code-festival-2016-qualb/submissions/4229924
f:id:YukiMoto:20190211154742p:plain


記述量は多くなってしまいましたが、実行速度を3分の1以下にすることができました。


とくに注意せず System.out.println() で連続出力すると TLE になってしまう……といったような問題はまず無いと思いますが、実行速度を少しでも減らすための工夫の一つとして覚えておきたいです。