gpt4 book ai didi

长长度 StringTokenizer 的 Java 性能问题

转载 作者:行者123 更新时间:2023-11-30 04:59:26 25 4
gpt4 key购买 nike

我有一个程序,可以使用StringTokenizer读取和处理原始文本String中的数据。

最初,StringTokenizer 包含大约 1,500 个 token ,并且程序运行良好。但是原始内容增加了,现在变成了12000个左右,CPU消耗也大幅增加。

我正在调查问题并尝试找出根本原因。该程序使用 while 循环来检查是否还有剩余 token ,并根据读取的 token 采取不同的操作。我正在检查这些不同的操作,看看这些操作是否可以改进。

同时我想问一下,与处理 10 个短的 StringTokenizer 相比,处理一个长的 StringTokenizer 是否会消耗更多的 CPU 资源。

最佳答案

首先感谢您的意见。上周末,我使用修改后的程序对真实数据进行了压力测试,很高兴我的问题得到了解决(非常感谢 A.J. ^_^ )。我想分享我的发现。

在研究了 A.J. 提到的示例之后,我运行了一些测试程序来使用 StringTokenizer 和“indexOf”读取和处理数据(在我的情况下,与 StringTokenizer 相比,Regex 甚至更糟糕)。我的测试程序会计算处理 24 条消息(每条消息约 12000 个 token )需要多少微秒。

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;
}
}
  • 请注意,原始 token 中没有“空”数据。如果没有找到 FieldSeparator,“getToken(msg)”将返回 null(作为“不再有 token ”的信号)。

关于长长度 StringTokenizer 的 Java 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7414400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com