1. ホーム
  2. .net

[解決済み] String.Join vs. StringBuilder: どっちが速い?

2023-04-28 02:48:57

質問

前の質問 の書式設定について double[][] をCSV形式に変換してください。 が提案されました。 を使用することが提案されました。 StringBuilder を使う方が String.Join . これは本当でしょうか?

どのように解決するのですか?

簡単な答え:それは依存します。

長い答え という文字列の配列がすでにあり、それを(デリミタで)連結する場合。 String.Join が最速の方法です。

String.Join は、すべての文字列に目を通して必要な長さを計算し、もう一度行ってすべてのデータをコピーすることができます。これはつまり はありません。 余分なコピーが発生しないことを意味します。また のみ の欠点は、文字列を2回通過しなければならないことで、メモリキャッシュを必要以上に消費してしまう可能性があります。

もしあなたが しない があらかじめ文字列を配列として持っている場合、それは おそらく を使う方が速いでしょう。 StringBuilder - を使う方が速いかもしれませんが、そうでない状況もあるでしょう。もし StringBuilder を使うことがたくさんのコピーをすることを意味するなら、配列を構築して String.Join の方が速いかもしれません。

EDIT: これは、1回の呼び出しで String.Join への呼び出しがたくさんある場合に対して StringBuilder.Append . 元の質問では、2つの異なるレベルの String.Join の呼び出しがあったので、ネストされた呼び出しのそれぞれで中間文字列が作成されたはずです。つまり、さらに複雑で、推測するのが難しいのです。典型的なデータで、どちらの方法でも "win"(複雑さの点で)大幅に勝てるというのは驚きです。

EDIT: 家にいるときに、できるだけ苦痛にならないベンチマークを書きます。 StringBuilder . 基本的に、各要素が前の要素の約 2 倍の大きさの配列があり、それをうまく使うと、追加するたびに強制的にコピーできるはずです(区切り文字ではなく要素の、それも考慮しなければなりませんが)。この時点で、単純な文字列の連結とほぼ同じになります。 String.Join は何の問題もありません。