我有一个程序可以使用String
读取和处理原始文本StringTokenizer
中的数据
最初,StringTokenizer
包含约1,500个令牌,该程序可以正常运行。但是原始内容增加了,现在变成大约12,000个令牌,并且CPU消耗大大增加了。
我正在调查问题并尝试找出根本原因。该程序使用while循环来检查是否还有令牌,根据读取的令牌,将采取不同的操作。我正在检查这些不同的操作,以查看这些操作是否可以改进。
同时,我想问一下,与处理10个短StringTokenizer
相比,处理一个长长度的StringTokenizer
是否会花费更多的CPU。
最佳答案
首先,感谢您的意见。在上周末,我使用修订后的程序对真实数据进行了压力测试,很高兴我的问题得以解决(非常感谢A.J. ^ _ ^)。我想分享我的发现。
在研究了A.J.提到的示例之后,我运行了一些测试程序来使用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(作为“没有更多令牌”的信号)。
关于java - 长StringTokenizer的Java性能问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7414400/