目标:我对C ++中Microsoft Windows控制台应用程序的性能有疑问,该应用程序处理从串行com端口接收的数据帧。 在C和嵌入式系统中(我有大部分经验)我通常在编译时分配大缓冲区。 但是,由于我现在正在开发的是一个软件,它使用将在Windows上运行的逻辑协议来管理串行COM端口(上层软件将与此交互以便与串行总线中连接的嵌入式系统进行通信), RAM和CPU速度不是问题,我正在利用C ++的对象功能。
我的解决方案:所以我正在做的是,当我收到数据帧时,我有一个类可以存储所有信息,如帧类型(确认响应,nack响应,确认请求等),源和目标节点地址和有效负载(我动态分配动态长度为0到1024字节的缓冲区)。 我现在正在做的是,我有一个5字节的编译时分配缓冲区,它将头部存储在处理协议的类中。一旦我收到一个完整的5字节头,我使用有效载荷大小字段来分配存储有效载荷所需的缓冲区,一是接收到全帧,我计算crc16并验证数据是否有效,如果是,我是而不是创建一个框架类对象,它将存储所有信息加上指向存储有效负载的分配缓冲区的指针(因此不需要复制),然后将数据包对象传递给上面的层以进行更多处理,无论如何,框架也是如此一旦从上述软件层删除了帧对象,对象析构函数将解除分配存储有效负载的缓冲区。 这是一个好方法,还是我在杀死PC性能。 TX调度是以类似的方式完成的。 有什么建议吗?
答案 0 :(得分:0)
你的解决方案很好。如果在编译时不知道大小,则在运行时分配缓冲区不被视为不良做法。看起来你还要小心不要不必要地复制缓冲区,这是一种很好的做法。
如果您担心性能问题,可以尝试第三方分配器,例如TCMalloc或JEMalloc,尽管这些分配器通常可以帮助解决更多线程或碎片化的内存空间问题。
如果这些缓冲区通常具有相似的大小,并且不断分配和释放,则可以在初始化时创建缓冲池,并在运行时向池中请求/返回它们,而不是调用new / delete。