2015-07-03 62 views
-1

我想弄清楚是否有比我現在要做的更有效的方式來建立一個串口上進來的消息並驗證它是正確的信息,然後再解析它。一條完整的消息以$開頭,以CR/LF結尾。我使用事件處理程序來獲取字符,因爲它們顯示在串口上,因此消息不一定會作爲一個完整的塊顯示。只是爲了混淆事物,串行端口上有許多其他消息不一定以$開頭或以CR/LF結尾。我想看到那些但不解析它們。我知道連接字符串可能不是一個好主意,所以我使用StringBuilder來構建消息,然後使用幾個.ToString()調用來確保我有正確的消息來解析。 .ToString調用是否會產生很多垃圾?有沒有更好的辦法?尋找一種有效的方法來構建和解析沒有GC的字​​符串

我不是一個特別有經驗的程序員,所以感謝您的幫助。

private void SetText(string text) 
    { 
     //This is the original approach 
     //this.rtbIncoming.Text += text; 

     //First post the raw data to the console rtb 
     rtbIncoming.AppendText(text); 

     //Now clean up the text and only post messages to the CPFMessages rtb that start with a $ and end with a LF 
     incomingMessage.Append(text); 

     //Make sure the message starts with a $ 
     int stxIndex = incomingMessage.ToString().IndexOf('$'); 
     if (stxIndex == 0) 
     { } 
     else 
     { 
      if (stxIndex > 0) 
       incomingMessage.Remove(0, stxIndex); 
     } 

     //If the message is terminated with a LF: 1) post it to the CPFMessage textbox, 
     //           2) remove it from incomingMessage, 
     //           3) parse and display fields 
     int etxIndex = incomingMessage.ToString().IndexOf('\n'); 
     if (etxIndex >= 0) 
     { 
      rtbCPFMessages.AppendText(incomingMessage.ToString(0, etxIndex)); 
      incomingMessage.Remove(0, etxIndex); 
      parseCPFMessage(); 
     } 
    } 
+1

當您使用串行端口(不是最快的設備)並且處理「小」字符串時,請不要擔心垃圾收集。在分配/處理大內存塊時會出現一些GC問題,但情況並非如此 – Graffito

回答

1

做的ToString調用產生多少垃圾?

每當您撥打ToString()時,都會得到一個新的String對象實例。這是否「非常垃圾」取決於您對「很多垃圾」的定義以及您對這些實例所做的操作。

有沒有更好的方法?

您可以直接檢查的StringBuilder的內容,但你必須寫自己的方法來做到這一點。您可以使用基於狀態機的技術來監視數據流。

無論任何,這將是比你當前實現「更好」取決於多種因素,包括但不限於:

  • 你現在有一個具體的性能問題?
  • 如果是這樣,你試圖達到什麼樣的性能目標?
  • 代碼中存在其他開銷嗎?

上面的第一個問題非常重要。你的第一優先權應該是代碼工作。如果您的代碼現在正在運行,並且沒有您需要解決的特定性能問題,那麼您現在可以安全地忽略GC問題。 .NET的GC系統被設計成在像這樣的場景中表現良好,通常也會。只有在不尋常的情況下,您才需要做額外的工作來解決性能問題。

沒有a good, minimal, complete code example明確地說明了上述和任何其他相關問題,不可能用任何特殊性來說明事實上是否存在「更好的方式」。如果上述答案沒有提供您正在尋找的信息,請考慮improving your question,以免它不那麼寬泛。

相關問題