我试图用C++编写一个程序,以尽可能最快的方式处理大量数据包.来自标准的所有数据包应尽可能快地读取,从池中发送到一个线程进行处理,然后处理到将数据包写入标准输出的输出线程.
当您在C++中使用标准输入和输出时,建议在任何输入或输出之前调用std :: ios_base :: sync_with_stdio(false)函数.在某些环境中,这可以实现很大的加速,但是在调用之后应该避免使用标准C函数进行输入/输出.
嗯,这似乎在单个线程中完美运行.但正如我所说,我的意图是使用一个线程进行输入,一个用于输出,多个线程用于并行处理.我观察到输出有些问题.这是输出线程(非常简化):
void PacketDispatcher::thread_process_output(OutputQueue& output_queue) {
std::vector<Packet> packet_list;
while(output_queue.get(packet_list)) {
for (const auto& packet: packet_list) {
std::cout << "Packet id = " << packet.id << "\n";
}
}
std::cout.flush();
}
Run Code Online (Sandbox Code Playgroud)
如果我使用std :: endl而不是"\n",那么腐败就会减少,但是std :: endl强制刷新流,在这种情况下影响性能(并且问题没有解决,只是最小化).
这是使用std :: cout的程序中唯一的一点,但是如果我在程序开始时调用std :: ios_base :: sync_with_stdio(false),我会得到一个明显的加速,但是我的输出总是被损坏了一些办法:
Packet id = Packet id = 4
Packet id = 5
Packet id = 6
Packet id = 7
Packet id = 8
Packet id …Run Code Online (Sandbox Code Playgroud)