长长度 StringTokenizer 的 Java 性能问题

标签 java string stringtokenizer

我有一个程序,可以使用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/

相关文章:

java - 如何在 iText 中的 PDFPTable 中显示动态列表

java - Eratosthenes 分段筛法 - Java

android - 如何标记具有许多不同字符的字符串?

Java:字符串标记器到数组

c# - 有没有一种简单的方法可以将序数数字字符串转换为其匹配的数值?

java - 两个人相同的代码,只有一个人出现NullPointerException?

java - 如何创建复杂的按钮形状?

java - 如何将多个对象从 Angular2 发送到 Java Spring 后端

c# - 以正确的方式在 C# 中解析字符串

c - 如何在 Arduino 上将字符串转换为 uint8_t 数组?