少なくとも私がよく知っている言語(C、Java、C#)では、非効率な理由の説明は正確です。私は仕事C#コードでの豊富な使用法がありStringBuilder
、String.Format
過剰に再割り当てを避けるためにtechiniquesを保存するすべてのメモリされている、など。
したがって、あなたの質問の答えを得るために、別の質問をしなければなりません:文字列を連結することが本当にStringBuilder
StringBuffer
問題にならないなら 、なぜクラスが好きで存在するのでしょうか?なぜこのようなクラスの使用は、半初心者のプログラミングの本やクラスにも含まれているのですか?どうやら早すぎる最適化のアドバイスがそれほど顕著になるのでしょうか?
ほとんどの文字列連結開発者が回答を純粋に経験に基づいている場合、ほとんどはそれが違いを生むことはないと言い、「読みやすい」を支持してそのようなツールの使用を避けfor (int i=0; i<1000; i++) { strA += strB; }
ます。 しかし、彼らはそれを決して測定しませんでした。
この質問に対する本当の答えは、このSOの回答で見つけることができます。これは、1つのインスタンスで、50,000文字列(アプリケーションによってはよくあることかもしれません)を連結すると、小さな文字列でも1000xのパフォーマンスヒットにつながることを明らかにしています。
パフォーマンスが文字通り何も意味しない場合は、必ず連結してください。しかし、代替(StringBuilder)を使用することは困難であるか読みにくいことに同意しません。したがって、「時期尚早な最適化」防御を起動すべきではない合理的なプログラミング手法となります。
更新:
これが何に帰着するかは、プラットフォームを知っており、そのベストプラクティスに従うことだと思います。2つの異なる「現代言語」からの2つの例:
- 別のSO回答、正反対の性能特性(+ = VS array.join)があることが判明した時々で真のJavaScript。一部のブラウザでは、文字列の連結は自動的に最適化されるように見えますが、そうでない場合もあります。(少なくともSOの質問では)推奨事項は、連結するだけで、心配しないことです。
- 別のケースでは、Javaコンパイラは、連結をStringBuilderなどのより効率的な構成に自動的に置き換えることができます。ただし、他の人が指摘しているように、これは不確定であり、保証されていません。StringBuilderを使用しても読みやすさは損なわれません。この特定のケースでは、大規模なコレクションの連結の使用や、不確定なJavaコンパイラの動作に依存することをお勧めします。同様に、.NETでは、並べ替えの最適化は実行されません。
すべてのプラットフォームのすべてのニュアンスをすぐに知らないのは、まさに重大な罪ではありませんが、このような重要なプラットフォームの問題を無視することは、JavaからC ++に移行し、メモリの割り当てを気にしないことに似ています。