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

10-10 15:03