2015-05-09 107 views
4

在我的应用程序开发一个性能问题来到我的脑海:什么是从字符串检索值的最快方法?

我有很多的数据线,可以看起来像这样:

  • ANG:-0.03,0.14,55.31
  • !ANG:-0.03,-0.14,305.31
  • ANG:-234.03,-0.14,55.31
  • 一般
  • :ANG:浮球,浮球,浮球

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

为了检测在开始时损坏,我只是用

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

我能做些什么,以检测在年底受损线路线?提及我非常重要的一点是,我不仅需要检查这条线是否正确,而且还要让这3个浮点数在以后使用。

我发现三个选项是:

  • 使用正则表达式
  • 分两次(第一次 “:” 和第二 “”)和count元素
  • 使用扫描仪类

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

编辑:

一些意见,我看,这是值得写后如何破损线的外观:

  • 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行数据包。

什么我迄今为止的发现是用扫描仪的大缺点 - 每行我需要创建新的对象,并在一段时间后我的设备开始变得短上的资源。

+1

尝试你的三个选项,并找出哪一个最好 – Shar1er80

+1

你到底意味着什么?给一个样本破坏字符串 –

+0

所有这些选项都可以工作,但这里的答案也取决于你的“完好无损”的行,所以你可以发布一些? – DoubleMa

回答

1

基准他们,然后你就会知道。

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

+0

同意。 *理论上*正则表达式与状态机的性能相同,但[实际上大多数正则表达式实现不会](https://swtch.com/~rsc/regexp/regexp1.html)。还要注意“一个符合你的格式的状态机”通常被称为[Lexer](http://en.wikipedia.org/wiki/Lexical_analysis)。 –

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代码在你自己的状态机...

相关问题