从String中检索值的最快方法是什么?

时间:2015-05-09 23:55:59

标签: java performance

在我的应用开发期间,我想到了一个性能问题:

我有很多类似的数据:

  • ANG:-0.03,0.14,55.31
  • ANG:-0.03,-0.14,305.31
  • ANG:-234.03,-0.14,55.31
  • 一般来说:!ANG:float,float,float

在这些线之间还有“损坏”的线 - 它们不是从一开始!或者太短/有额外的迹象等等。

要检测在开始时损坏的行,我只需使用

if(myString.charAt(0) != '!')//wrong string

我能做些什么来检测最后损坏的线路?值得一提的是,我不仅需要检查线路是否正确,还要获得这3个浮点数以便以后使用。

我找到了三个选项:

  • 使用regexp
  • 拆分两次(第一个“:”和第二个“,”)和计数元素
  • 使用Scanner类

从性能的角度来看,我不确定这个(或许还有其他)方法中哪一个是最好的。你能给我一些建议吗?

修改

经过一些评论后,我发现有必要写一下损害线的外观:

  • NG:-0.03,0.14,55.31
  • .14,55.31
  • ANG:-0.03,0.14,
  • !A,-0.02,-0.14,554,-0.12,55

很难谈论线路的数量,因为我从其他设备的读数中得到它们,所以我一次得到大约20行的数据包,频率为50Hz。

到目前为止我发现的是使用扫描仪的一大缺点 - 对于我需要创建新对象的每一行,一段时间后我的设备开始缩短资源。

2 个答案:

答案 0 :(得分:1)

对他们进行基准测试,然后你会知道。

最快的方法是编写自己的小型状态机以匹配您的格式并找到浮动边界。 理论上一个正则表达式将具有相同的性能,但它可能会有额外的开销。

答案 1 :(得分:0)

作为一种中间解决方案,我会做类似的事情:

private static class LineObject {
    private float f1, f2, f3;
}

private LineObject parseLine(String line) {
    LineObject obj = null;
    if (line.startsWith("!ANG:")) {
        int i = line.indexOf(',', 5);
        if (i != -1) {
            int j = line.indexOf(',', i+1);
            if (j != -1) {
                try {
                    obj = new LineObject();
                    obj.f1 = Float.parseFloat(line.substring(5, i));
                    obj.f2 = Float.parseFloat(line.substring(i+1, j));
                    obj.f3 = Float.parseFloat(line.substring(++j));
                } catch (NumberFormatException e) {
                    return null;
                }
            }
        }
    }
    return obj;
}

在你自己的状态机中只能复制/粘贴startsWith,indexOf和parseFloat的有用的jdk代码...