2011-10-19 7 views
3

私はこのようなループを持っている:ストリングと性能

String myString = "123456789"; 
    String prefix = null; 
    for (int i=6;i>=0;--i) 
    { 
     prefix = myString.substring(0,i); 
     process(prefix); 
    } 

は、問題は、このコードブロックがN回実行される場合、N * 7つの文字列が作成されることである(7つの文字列がそれぞれ作成されますサブストリングメソッドは新しいストリングを作成し、このメソッドは実行ごとに7回呼び出されるため)。 この場合、パフォーマンスを向上させる方法について考えています。私は、実行ごとに1つのStringのみを使用する方法があるかどうかを知りたかったので、毎回これを変更しました。それは、StringBuilderのの目的だが、私はStringBuilderのは、この場合には役に立たないと思う:この場合

String myString = "123456789"; 
    StringBuilder prefix = new StringBuilder(myString); 
    for (int i=6;i>=0;--i) 
    { 
     prefix.delete(i,prefix.length()); 
     process(prefix.toString()); 
    } 

、接頭辞は常に同じStringBuilderオブジェクトを参照するが、同じ問題がプレフィックスので、別の場所に表示されます。 toString()は常に新しいStringオブジェクトを返します。

(私はトピックが何度も扱われてきた。しかし、私はいくつかの検索を行ってきたと私は解決策を見つけられませんでした、多分それはメモリの最小限の使用だということを知っていますか?)あなたの助け

ため

感謝

+0

StringBuilderで処理するプロセスメソッドを変更できませんか?それともCharSequenceを使用して両方を受け入れますか? – berry120

+0

あなたは 'StringBuilder'(または最も特定の共通のスーパータイプを取る' CharSequence')を取ることができますか? –

+1

"パフォーマンスを改善する"を定義してください。コードの実行が遅すぎますか?あまりにも多くのメモリを使用していますか?もしそうなら、どれくらいの頻度でそれを使う必要がありますか? – JRL

答えて

6

myString.substring(0, i)が新しいStringオブジェクトを作成するのは間違いありませんが、これは基礎となる文字データをコピーしないことに注意してください。

このコードを実行する前に、プロファイラを使用して、これが実際にボトルネック(CPU使用率、またはガベージコレクタにかかる負荷の点で)かどうかを検証します。

+2

+1のためのプロファイリングの前に –

+0

ありがとう!あなたが言ったように、それは常に同じchar [](値フィールド)を使用するので、問題は数百万回の部分文字列の呼び出しにしか存在しない可能性があります。それは私の場合ではありません。 –

0

あなたが本当にその最適化が必要な場合は、私が見ることができる唯一のオプションは、プロセスメソッドにインデックスを渡し、そのメソッドの中に、元の文字列を操作することです:プロセス・メソッドが何をするかに応じて、

for (int i=6;i>=0;--i) 
{ 
    process(prefix, i); 
} 

、これは実際には、 i

0

"実行時に1つのStringだけを使用する方法があるかどうかを知りたかったのですが、毎回これを変更しました。" Stringクラスは不変なので、動作しません。多くの文字の変更を修正する必要があるコードがある場合は、StringBuilderを排他的に使用することをおすすめします(つまり、StringBuilderの引数を受け入れるための「プロセス」メソッドを変更する)ことをおすすめします。

1

正確にはこれの目標は何ですか?

ループ中に作成されるストリングのインスタンスは7つありますが、ストリングは変更できないため、ソースストリングのコピーはすべて保存されませんが、古いストリングの参照のみです変更することができないため保存する)、そのためにはあまりメモリを消費しません。

+0

現実世界の問題は、「i」や何百万回もの反復処理の値が大きいことを推測しています –

1

メモリの使用はどういう意味ですか?

2番目のメソッドを使用すると、新しい文字列が作成されますが、メソッドがコールスタックからポップされると(つまり、メソッドが終了したら)Javaのガベージコレクタはメモリから文字列を削除します。つまり、元の文字列と接頭辞の文字列は、いつでも2つの文字列を持つことになります。

+0

これらの文字列は返された後にリリースされますが、文字列が少ない)、GCはあまり頻繁に呼び出されず、メモリから解放するオブジェクトが少なくなるため実行時間が長くなります。 –

関連する問題