寻找一种在没有GC的情况下构建和解析字符串的有效方法

时间:2015-07-03 22:17:02

标签: c# parsing serial-port

我试图弄清楚是否有一种比我现在正在做的更有效的方法来建立一个串行端口上的消息,并在我解析它之前验证它是正确的消息。完整的消息以$开头,以CR / LF结尾。我使用一个事件处理程序来获取它们在串口显示的字符,因此消息不一定会作为一个完整的块出现。只是为了混淆事情,串口上有许多其他消息,不一定以$开头或以CR / LF结尾。我想看到那些但不解析它们。我知道连接字符串可能不是一个好主意所以我使用StringBuilder来构建消息,然后我使用几个.ToString()调用来确保我得到了正确的解析消息。 .ToString调用会产生多少垃圾?还有更好的方法吗?

我不是一个特别有经验的程序员,所以感谢你的帮助。

    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 个答案:

答案 0 :(得分:1)

  

.ToString调用会产生多少垃圾吗?

每次调用ToString()时,都会获得一个新的String对象实例。是否有很多垃圾"取决于你对"多垃圾的定义"以及你对这些实例做了什么。

  

有更好的方法吗?

您可以直接检查StringBuilder的内容,但是您必须编写自己的方法来执行此操作。您可以使用基于状态机的技术来监控数据流。

是否会有更好的"更好的"比您当前的实施取决于许多因素,包括但不限于:

  • 您现在是否看到了特定的性能问题?
  • 如果是这样,您想要达到什么具体的性能目标?
  • 您的代码中还存在哪些其他开销?

上面的第一个问题非常重要。您的首要任务应该是工作的代码。如果您的代码现在正在运行,并且没有您知道需要解决的特定性能问题,那么您现在可以安全地忽略GC问题。 .NET的GC系统设计用于在这样的场景中表现良好,通常也会如此。只有在异常情况下,您才需要做额外的工作来解决性能问题。

如果没有a good, minimal, complete code example清楚地说明上述问题和任何其他相关问题,就不可能具体说明是否有更好的方式"。如果上述答案没有提供您正在寻找的信息,请考虑improving your question以使其不那么广泛。