2015-05-09 143 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代碼在你自己的狀態機...

相關問題