繁体   English   中英

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

[英]What is the fastest way to retrieve values from String?

在我开发应用程序时,我想到了一个性能问题:

我有很多数据行可能看起来像这样:

  • 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个浮点数以供以后使用。

我发现了三个选择:

  • 使用正则表达式
  • 分割两次(第一个“:”和第二个“,”)并计数元素
  • 使用扫描仪类

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

编辑:

经过一番评论后,我发现有必要写出损坏线的外观:

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

谈论行数是非常困难的,因为我是从其他设备的读数中获取行数的,所以我一次以50Hz的频率接收到大约20行的数据包。

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

对它们进行基准测试,然后您就会知道。

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

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

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代码之后...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM