Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
长字符串标记器的Java性能问题_Java_String_Stringtokenizer - Fatal编程技术网

长字符串标记器的Java性能问题

长字符串标记器的Java性能问题,java,string,stringtokenizer,Java,String,Stringtokenizer,我有一个程序,可以使用 最初,StringTokenizer包含大约1500个令牌,程序工作正常。然而,原始内容增加了,现在它变成了大约12000个令牌,CPU消耗大大增加 我正在调查这个问题,并试图找出根本原因。程序使用while循环来检查是否还有任何令牌,并根据令牌读取情况,采取不同的操作。我正在检查这些不同的行动,看看这些行动是否可以改进 同时,我想问,与处理10个短StringTokenizer相比,处理一个长StringTokenizer是否需要更多的CPU 为什么不试试新的Scann

我有一个程序,可以使用

最初,
StringTokenizer
包含大约1500个令牌,程序工作正常。然而,原始内容增加了,现在它变成了大约12000个令牌,CPU消耗大大增加

我正在调查这个问题,并试图找出根本原因。程序使用while循环来检查是否还有任何令牌,并根据令牌读取情况,采取不同的操作。我正在检查这些不同的行动,看看这些行动是否可以改进


同时,我想问,与处理10个短
StringTokenizer
相比,处理一个长
StringTokenizer
是否需要更多的CPU

为什么不试试新的Scanner类呢?可以使用流和文件构造扫描仪。但是,不确定它是否比旧的StringTokenizer更有效。

StringTokenizer的使用是不鼓励的。 它没有被弃用,因此可以使用。只是不推荐。下面写的是:

“StringTokenizer是为兼容而保留的遗留类 原因,尽管新规范不鼓励使用。建议 任何寻求此功能的人都可以使用String的split方法 或者改为java.util.regex包。“

请查看下面的帖子。它有一个很好的例子,展示了各种方法来做你想做的事情


您可以试试这里提供的样品,看看什么最适合您。

首先,感谢您的意见。在上周末,我用一个修改过的程序对真实数据进行了压力测试,我很高兴我的问题得到了解决(多亏了a.J.^ u^)。我想分享我的发现

在研究了A.J.提到的示例之后,我运行了一些测试程序,使用StringTokenizer和“indexOf”读取和处理数据(在我的情况下,与StringTokenizer相比,Regex甚至是最差的)。我的测试程序将计算处理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
        }
    }
}
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;
    }
}
这里是使用“indexOf”更新的程序:

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
        }
    }
}
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;
    }
}
  • 请注意,原始令牌中没有“null”数据。如果未找到字段分隔符,“getToken(msg)”将返回null(作为“无更多令牌”的信号)

您确定这是StringTokenizer,而不是您正在使用它吗?请拿出一个简短但完整的程序来演示这个问题。我不这么认为。字符串是随机访问,对于长字符串不应减慢速度。
StringTokenizer
中没有任何东西会因为长输入而崩溃。它必须是周围代码中的某个东西。这个问题如果没有答案是毫无价值的。谢谢A.J。你推荐的帖子对解决我的问题非常有帮助。