まず、ご意見をお寄せいただきありがとうございます。先週末、修正したプログラムを使用して実際のデータでストレス テストを実行し、問題が解決してとても満足しています (AJ に感謝します ^_^ )。私の発見を共有したいと思います。
AJが言及した例を調べた後、StringTokenizerと「indexOf」を使用してデータを読み取って処理するテストプログラムを実行しました(私の状況では、正規表現はStringTokenizerと比較して最悪です)。私のテスト プログラムは、24 個のメッセージ (それぞれ ~12000 トークン) を処理するのに必要なミニ秒数をカウントします。
StringTokenizer は完了するのに最大 2700 ミリ秒かかりますが、"indexOf" は最大 210 ミリ秒しかかかりません!
次に、プログラムを次のように (最小限の変更で) 修正し、先週末に実際のボリュームでテストしました。
元のプログラム:
public class MsgProcessor {
//Some other definition and methods ...
public void processMessage (String msg)
{
//...
StringTokenizer token = new StringTokenizer(msg, FieldSeparator);
while (token.hasMoreTokens()) {
my_data = token.nextToken();
// peformance different action base on token read
}
}
}
そして、「indexOf」を使用して更新されたプログラムは次のとおりです。
public class MsgProcessor {
//Some other definition and methods ...
private int tokenStart=0;
private int tokenEnd=0;
public void processMessage (String msg)
{
//...
tokenStart=0;
tokenEnd=0;
while (isReadingData) {
my_data = getToken(msg);
if (my_data == null)
break;
// peformance different action base on token read ...
}
}
private String getToken (String msg)
{
String result = null;
if ((tokenEnd = msg.indexOf(FieldSeparator, tokenStart)) >= 0) {
result = msg.substring(tokenStart, tokenEnd);
tokenStart = tokenEnd + 1;
}
return result;
}
}
- 元のトークンには「null」データがないことに注意してください。FieldSeparator が見つからない場合、"getToken(msg)" は null を返します ("no more token" のシグナルとして)。