2011-12-06 16 views
1

JavaからRedisにアクセスするためのコードを書いています。そのため、たくさんのStringをキーとして作成する必要があります。これらのキーにはパターンがありますが、同じアクセスに対して同じキーを繰り返し再生することになります。StringBuilderの処理速度が遅く、結果をキャッシュする必要がありますか?

(DAOパラメータに基づいて)生成されたキーのキャッシュを実装することを検討していますが、キャッシュの速度を指定しても、スピードアップが複雑になるかどうかは疑問です。

キーは、3〜7文字の文字列で連結されたUUIDで構成されています。このシナリオでは、キャッシュを保証するにはStringBuilderの速度が十分ですか?

+3

プロファイリングが確実にわかる唯一の方法です。 – dasblinkenlight

+2

同じ文字列を多く動的に作成すると、[String interning](http://en.wikipedia.org/wiki/String_interning) 'String#intern()' –

+0

それは、合理的に小さな文字列の単一連結であれば、キャッシュルックアップは確かに遅くなります。 –

答えて

3

プロファイリングだけではわかりますが、キャッシュする場合は、キャッシュから取得する方法が必要です。少なくとも、StringBuilderを使用する場合と同じくらいオーバーヘッドがかかる可能性があります。誰もが、プロファイルを言っているよう

String result = strPart1 + strPart2; 
+1

プロファイリングでさえ本当に答えが分からないことがあります。パフォーマンスは少し向上するかもしれませんが、長命のオブジェクトをたくさん追加すると、ガベージコレクションをより高価にすることになります。それは把握するのがはるかに難しくなります。 – Bill

+4

@Bill - プロファイリングを別の方法で使用できます。アプリケーションを長時間実行し、OPが心配しているStringBuffer呼び出しでアプリケーションの時間の何パーセントが費やされたかを測定するだけです。パーセンテージが小さい場合、キャッシングによるパフォーマンス向上のための* potential *も同様に小さくなります。それで、あなたは最適化しようとする努力の価値があるかどうかを決めることができます。 –

+0

はい正しいです。しかし、プロファイラーでGCに及ぼす影響を調べるのは難しいです。 – Bill

1

のようなものをやったときに

のStringBuilderを内部的に使用されます。 UUIDが固定されている場合は、次のように少し物事をスピードアップすることができます

public class KeyGenerator { 
    private final StringBuilder sb; 
    private final int uidLen; 

    public KeyGenerator(String uid) { 
     sb = new StringBuilder(uid); 
     uidLen = uid.length(); 
    } 

    public String getKey(String suffix) { 
     sb.setLength(uidLen); 
     sb.append(suffix); 
     return sb.toString(); 
    } 
} 

をこれは、あなたが鍵を必要とするたびに新しいのStringBuilderを構築し、UIDを追加し保存します。また、キャッシュよりも少しシンプルです。

+0

Javaでのオブジェクトのインスタンス化は非常に高速です。 –

+0

@MДΓΓLLLLLL - OPのすべてが高速です。我々は相対的なスピードアップを取っている。オブジェクトのインスタンス化だけでなく、毎回UID文字をStringBuilderにコピーします。すべてのキーに対して新しいStringBuilderを作成しないことで回避できるガベージコレクションはもちろんです。 (鍵生成率は何か分かりませんが、OPがこれを懸念している場合はおそらくかなり高いでしょう) –

+0

@TedHopp - * "おそらくかなり高い" * ... OPの直感が正しいと仮定して。彼は本当に最初にプロファイルする必要があります。 –

関連する問題