19

呼び出し時に約 60 の配列サイズを返すコンマ区切りの文字列がありString.split(",")ます。特定のユース ケースでは、配列から返される 2 番目の値の値のみを取得する必要があります。たとえば"Q,BAC,233,sdf,sdf,"、最初の文字列の後','と2番目の文字列の前の値だけが必要です','。パフォーマンスに関する質問は、部分文字列を使用して自分で解析するか、分割メソッドを使用して、配列の 2 番目の値を取得する方がよいですか? 任意の入力をいただければ幸いです。このメソッドは 1 秒間に何百回も呼び出されるため、パフォーマンスとメモリ割り当てに関する最善のアプローチを理解することが重要です。

-ダンカン

4

5 に答える 5

40

String.Splitを返すため、string[]60-way を使用すると、Split1 行あたり約 60 の不要な割り当てが発生します。Split文字列全体を調べて、60 個の新しいオブジェクトと配列オブジェクト自体を作成します。これらの 61 個のオブジェクトのうち、1 つだけを保持し、ガベージ コレクターに残りの 60 個を処理させます。

これをタイトなループで呼び出す場合、部分文字列の方が確実に効率的です。文字列の 2 番目のコンマまでの部分を通過し、,保持する新しいオブジェクトを 1 つ作成します。

String s = "quick,brown,fox,jumps,over,the,lazy,dog";
int from = s.indexOf(',');
int to = s.indexOf(',', from+1);
String brown = s.substring(from+1, to);

上記の印刷物 brown

これを複数回実行すると、substring時間通りに勝つsplitことがわかります。1,000,000 回の反復で 3.36 秒かかりますが、1,000,000 回の反復でsubstringはわずか 0.05 秒かかります。そして、それは文字列に 8 つのコンポーネントしかありません! 60 コンポーネントの違いは、さらに劇的になります。

于 2012-12-21T21:24:41.140 に答える
4

もちろん、文字列全体を反復処理する理由はsubstring()indexOf()

于 2012-12-21T21:23:46.087 に答える
3

次の 2 つの理由から、手動で行う方が確実に優れています。

  • .split()文字列を引数として取りますが、この文字列は として解釈され、PatternユースケースPatternではコストがかかります;
  • あなたが言うように、必要なのは 2 番目の要素だけです。その 2 番目の要素を取得するアルゴリズムは、手作業で行うのに十分簡単です。
于 2012-12-21T21:25:29.843 に答える
2

私は次のようなものを使用します:

final int first = searchString.indexOf(",");
final int second = searchString.indexOf(",", first+1);
String result= searchString.substring(first+1, second);
于 2012-12-21T21:28:06.763 に答える
1

私の最初の傾向は、最初と 2 番目のコンマのインデックスを見つけて、部分文字列を取得することです。

ただし、確実に判断する唯一の実際の方法は、特定のシナリオでそれぞれをテストすることです。適切なストップウォッチを取り出して、2 つを測定します。

于 2012-12-21T21:24:28.427 に答える