0

私は非常に大きな文字列を可能な限り最速の方法で分割する必要があり、私が行った調査から2つの可能性に絞り込みました:

1. Pattern.compile("[delimiter]").split("[large_string]");
2. 反復しStringBuilderて呼び出すsubstring

StringBuilder sb = new StringBuilder("[large_string]");
ArrayList<String> pieces = new ArrayList<String>();
int pos = 0;
int currentPos;
while((currentPos = sb.indexOf("[delimiter]", pos)) != -1){
    pieces.add(sb.substring(pos, currentPos));
    pos = currentPos+"[delimiter]".length();
}

私はそれらをベンチマークしますが、私は理論的な部分にもっと興味があります.なぜ一方が他方より速いのか.

さらに、他の提案があれば投稿してください。

更新:ベンチマークを行ったと言ったように、それぞれが 32 文字の 5 ミルの文字列を生成し、これらは で区切られた単一の文字列に入れられました~~

  1. StringBuilder驚くべきことに、アプローチは平均で最も遅く、2.50-2.55 sec
  2. Pattern.compile.splitの平均で 2 位になる2.47-2.49 sec
  3. Splitterグアバは、他の人の1.12-1.18 sec 半分の時間で誰もが認める勝者でした(それを提案したfgeに特に感謝します)

助けてくれてありがとう!

4

3 に答える 3

3

文字列が大きい場合、考慮すべきことは、コピーが作成されるかどうかです。StringBuilder を使用せずにプレーンString#substring(from,to)を使用すると、文字列の内容のコピーは作成されません。String全体の 1 つのインスタンスが存在し、少なくとも 1 つの部分文字列が存続する限り存続します。

うーん... Pattern クラスのソースを精査すると、分割が同じことを行うことがわかりますが、StringBuilder のソースは、部分文字列ごとにコピーが作成されることを示しています。

于 2013-06-14T14:12:39.420 に答える