Прежде всего, спасибо за ваше мнение.На прошлых выходных я провел стресс-тест с реальными данными, используя пересмотренную программу, и был очень рад, что моя проблема решена (большое спасибо AJ ^ _ ^).Я хотел бы поделиться своими выводами.
Изучив пример, упомянутый AJ, я запустил некоторую тестовую программу для чтения и обработки данных, используя StringTokenizer и "indexOf" (Regex даже хуже, чем 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;
}
}
- Обратите внимание, что в исходных токенах нет нулевых данных.Если FieldSeparator не найден, «getToken (msg)» вернет ноль (как сигнал для «больше нет токена»).