首先,感谢您的意见。上周末,我使用修改后的程序对真实数据进行了压力测试,很高兴我的问题得到了解决(非常感谢 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)”将返回 null(作为“没有更多令牌”的信号)。