質問
は不変性の文字列作業による計算書、または文字列内です。
例えば、を解決するために必要となる以下のコードの配分の二つの文字列にヒープ.
string s = "hello ";
s += "world!";
"こんにちは"は、ヒープまでゴミの収集;s現在の参照"hello world!"のヒープ.しかし、どのように多くの文字列は、以下のライン配置のヒープ...1または2?もあるので、ツール/うのですが。
string s = "goodbye " + "cruel world!";
解決
コンパイラは、2番目の例では、唯一のこれまでの 1 の文字列である理由である文字列の連結のための特別な処理があります。そして「インターン」あなたはこのラインを20000回実行しても、まだ1つのだけの文字列が存在することを意味します。
の結果をテストする再...(この場合は)最も簡単な方法は、反射鏡で見て、おそらくです:
.method private hidebysig static void Main() cil managed
{
.entrypoint
.maxstack 1
.locals init (
[0] string s)
L_0000: ldstr "goodbye cruel world!"
L_0005: stloc.0
L_0006: ldloc.0
L_0007: call void [mscorlib]System.Console::WriteLine(string)
L_000c: ret
}
あなたは(ldstr
)見ることができるように、コンパイラはすでにあなたのためにこれを行っている。
他のヒント
実際には、おそらく3.その後、「さようなら」、「残酷な世界」のためのconst文字列、および結果のための新しい文字列ます。
のためのconst文字列あなたは、生成されたコードを見ることで確実に見つけることができます。中間コードを取得するには(私が思うに、manページを確認してください)これは、コンパイラに依存し(そして、実際には、言語に、これは明らかにされていません)がありますが、-aフラグを使用して++グラムの出力を読み取ることができますます。
あなたは、文字列については、「知っている」何を信用してはいけません。あなたは、文字列の実装のためのソースコードに目を通すかもしれません。あなたの例では、たとえばます:
string s = "goodbye " + "cruel world!";
Javaでは単一の文字列を割り当てます。 Javaはかなりかわいいトリックを果たしており、裏をかくのは難しいだろう - あなたに必要になるまでちょうど最適化することはありません。
!現在しかし、私の知る限りでは、この使用します:
String s="";
for(int i=0;i<1000;i++)
s+=" ";
1000年宇宙の文字列を作成するには、まだ非常に非効率的である傾向がある。
ループに追加はかなり悪いですが、それ以外の場合は、おそらくStringBuilderのと同じくらい効率的です。
、ここで注意してください。あなたが使用している文字列が実行時まで知られていない場合は、いくつかの非常に異なるILが表示されます(設定ファイル、データベース、またはユーザー入力から引き出さ)。
あなただけの1つのまたは2つの文字列の連結をやろうとしている場合、私はそれについて心配しないでしょう。
あなたがの連結をたくさん持っている、またはあなたがループを持っている場合は、はしかし、その後、あなたは間違いなく予防措置を取りたいです。 Javaの世界ではそれはあなたが、文字列を連結するのStringBuffer insteadsを使用することを意味します。
、二つの文字列の連結は、StringBufferのに最初の文字列を作る連結をやって、その結果の文字列を返すことによって達成することができます。
のStringBufferを自分で作成することはやり過ぎのように思えるが、それはとにかく起こるために何が起こっているかだこと.-
ぜひんでお早市場に出す前に指令に適合しなかっ割引かどうかperformant文字列concatonationsができます。このオブジェクトを生成し、そのGCができなかった。
ある研究室(ASP.NET 激化エンジニア) Tess Ferrnandezの ブログを示のない極限を認の例 どの文字列concatonationできるサーバへの膝.
、それだけで1つの文字列になります「さようなら残酷な世界!」