并行解析 C++
Posted
技术标签:
【中文标题】并行解析 C++【英文标题】:Parallel Parsing C++ 【发布时间】:2016-05-10 12:58:15 【问题描述】:我想用 C++ 做一些(奇怪的)事情,主要想法如下:
-
接收用于控制仪器的命令字符串(SCPI 命令)。可以在向量或缓冲区中接收。
解析字符串并提取单个命令(如果字符串包含多个命令)
解析各个命令以提取助记符和参数(SCPI 命令的元素)。
将助记符与已有的解析器表匹配
有趣的是,我已经有了一个可行的解决方案,但是在批处理/解析命令时速度太慢了。
我希望以减少开销的方式来做到这一点。我的一个想法是从 SERIAL 转向 MULTITHREADED 方法(例如在不同线程中执行上述不同的操作,并最大限度地利用 CPU 内核)。
因此,我需要有关如何以及从何处开始的建议和提示?
【问题讨论】:
不是很了解 SCPI,但您收到的所有“命令”的长度是否相同?命令之间是否有任何关系,是否有顺序? (这意味着某些命令必须在其他命令之前运行。)从这些问题开始,看看代码的哪些部分可能被拆分为线程。std::thread
:-)
什么是“慢”?
@ZDF “慢”是指当您使用仪器测试设备并且有很多命令进出时,整体响应效率不高。对于少量的命令来说这很好,但是当你有一个自动化的测试系统时,它会增加很多开销。
@Joachim 命令其实不一样;其中一些接受参数,而另一些则不接受。并且没有命令的顺序。主要任务是解析传入/传出测试仪器的命令,然后进行一些计算(已经使用多线程实现)......
【参考方案1】:
并行处理命令是将解析命令的逻辑分离并在其自己的线程上运行,在命令从解析器传入时对其进行管道传输。
但是,并行解析串行流是另一回事。为了有效地批处理命令解析,您需要能够在不知道其内容的情况下拆分命令。
一种方法是利用数据包结构将命令块关联在一起,并确保并行解析器接收构建命令所需的所有块。
struct CommandPacket
uint8_t commandID;
uint8_t dataLength;
uint8_t data[MAX_PACKET_SIZE];
您可以简单地使用 id 的模数将数据包通过管道传输到解析器,以平均分配负载。
int parserIndex = packet.commandID % parserCount;
【讨论】:
以上是关于并行解析 C++的主要内容,如果未能解决你的问题,请参考以下文章