首先,感謝您的意見。在上個週末,我使用修改過的程序對真實數據進行了壓力測試,很高興我的問題得到了解決(非常感謝A.J.^_ ^)。我想分享我的發現。
在研究了A.J.提到的例子之後,我運行了一些測試程序來使用StringTokenizer和「indexOf」讀取和處理數據(在我的情況下,Regex與StringTokenizer相比甚至更差)。我的測試程序會計算需要多少微秒來處理24條消息(每條消息約12000個令牌)。
StringTokenizer需要〜2700ms才能完成,而「indexOf」只需要〜210ms!
我再修改我的計劃是這樣的(以最小的變化)和上週末期間與實際量測試:
原程序:
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(作爲「沒有更多標記」的信號)。
你確定它是StringTokenizer,而不是你*在做什麼*與它?請顯示一個簡短但完整的程序來說明問題。 –
我不這麼認爲。字符串是隨機訪問的,對於長字符串不應該減速。 – Thilo
「StringTokenizer」中沒有任何內容會導致長時間輸入。它必須是周圍代碼中的東西。 – Barend