5

特にトレースがオンになっている場合は、コード全体で頻繁に呼び出される、ログとトレースに関連するコードがあります。StringBuilderは、文字列を作成するために使用されます。文字列の最大長は妥当な長さで、数百文字のオーダーだと思います。

質問:次のようなことを行うための既存のライブラリはありますか?

// in reality, StringBuilder is final,
// would have to create delegated version instead,
// which is quite a big class because of all the append() overloads
public class SmarterBuilder extends StringBuilder {         

    private final AtomicInteger capRef;

    SmarterBuilder(AtomicInteger capRef) {
        int len = capRef.get(); 
        // optionally save memory with expense of worst-case resizes:
        // len = len * 3 / 4;
        super(len);
        this.capRef = capRef;
    }

    public syncCap() {
        // call when string is fully built
        int cap;
        do {
            cap = capRef.get();
            if (cap >= length()) break;
        } while (!capRef.compareAndSet(cap, length());
    }
}

これを利用するために、私のロギング関連のクラスには、capRef適切なスコープを持つ共有変数があります。

(ボーナス質問:興味があります。ループせずにsyncCap()を実行することは可能ですか?)

動機:StringBuilderのデフォルトの長さは常に小さすぎることを私は知っています。アドホックの初期容量値100を投入することもできます(現在はそうしています)。これにより、場合によってはサイズが変更されますが、常にそうとは限りません。ただし、ソースコードのマジックナンバーは好きではありません。この機能は、「一度最適化して、すべてのプロジェクトで使用する」場合です。

4

2 に答える 2

1

パフォーマンス測定を行って、余分な作業に対して実際に何らかの利益が得られていることを確認してください。

StringBuilderに似たクラスの代わりに、StringBuilderFactoryを検討してください。2つの静的メソッドを提供できます。1つはStringBuilderを取得するためのもので、もう1つは文字列の作成が完了したときに呼び出されるものです。引数としてStringBuilderを渡すと、長さが記録されます。getStringBuilderメソッドは、他のメソッドによって記録された統計を使用して、初期サイズを選択します。

syncCapでループを回避する方法は2つあります。

  1. 同期します。
  2. 失敗を無視します。

この状況で失敗を無視するための議論は、実際の長さのランダムサンプリングのみが必要であるということです。別のスレッドが同時に更新されている場合は、とにかく文字列の長さの最新のビューを取得しています。

于 2012-12-21T09:40:40.010 に答える
0

各文字列の文字列の長さを統計配列に格納できます。アプリを実行し、シャットダウン時に文字列の長さの90%の四分位数を取得します(すべてのstrの長さの値を並べ替え、配列pos =sortedStrings.size()*0,9で長さの値を取得します

このようにして、文字列の90%が収まる初期の文字列ビルダーサイズを作成しました。

更新
値はハードコーディングするか(JavaがArrayListの値10に対して行うように)、構成ファイルから読み取るか、テストフェーズで自動的に計算することができます。ただし、四分位数の計算は無料ではないため、プロジェクトを実行し、SmartBuilder内でその場で90%の四分位数を測定し、90%の四分位数を時々出力し、後で値を使用するようにプロパティファイルを変更することをお勧めします。 。

そうすれば、プロジェクトごとに最適な結果を得ることができます。
または、さらに一歩進んだ場合:Smart Builderに、構成ファイルでその値を随時更新させます。しかし、これはすべて努力する価値はありません。デジタルロードマップなど、数百万のエントリがあるデータに対してのみ実行します。

于 2012-12-21T09:28:40.167 に答える