【发布时间】:2015-04-08 08:26:56
【问题描述】:
这是我当前的函数,它对通过 Boost:Asio UDP 传输接收到的数据进行反序列化。它工作得很好,但是性能很差。每秒大约 4000 次左右的调用将使用约 16% 的 CPU,这是 I7 的完整线程。
对代码运行性能测试表明,这一行使用了 >95% 的 cpu 时间:
text_iarchive LLArchive(LLStream);
我的问题很简单:有没有一种方法可以重复使用 text_iarchive 而不必在每次调用函数时都创建一个新的? (在 C# 中也可以使用内存流和反序列化数据所需的其他变量)。我已经搜索了 Boost 文档,但没有提到任何类似的东西。
我本质上想要的是将下面的函数放在一个类中,并将尽可能多的变量定义为可以通过重新初始化(清除缓冲区/流,重新设置数据等)在函数内部使用的成员.这甚至会提高性能吗?更改传递到存档的流是否足以解决问题(它是否将其绑定到某个地方,以便如果我们更改传递的流,存档设置给自身的流也会更改)?
有可能吗?
非常感谢您的宝贵时间!
完整功能代码:
using namespace boost::archive;
using namespace boost::iostreams;
Packet InboundStreamToInternalPacket(boost::array<char, 5000> inboundStream)
{
Packet receivedPacket;
basic_array_source<char> arraySourceLL(inboundStream.data(), inboundStream.size());
stream<basic_array_source<char>> LLStream(arraySourceLL);
text_iarchive LLArchive(LLStream);
LLArchive >> receivedPacket;
return receivedPacket;
}
编辑 1:
尝试再次关闭和打开流,就像添加了新源一样,在反序列化到第二个数据包时崩溃并出现“内存位置 xxxxxx 处的 boost::archive::archive_exception”。
Packet InboundStreamToInternalPacket(boost::array<char, 5000> inboundStream)
{
Packet receivedPacket;
Packet receivedPacket2;
basic_array_source<char> arraySourceLL(inboundStream.data(), inboundStream.size());
stream<basic_array_source<char>> LLStream;
LLStream.open(arraySourceLL);
text_iarchive LLArchive(LLStream);
LLArchive >> receivedPacket;
LLStream.close();
LLStream.open(arraySourceLL);
LLArchive >> receivedPacket2;
return receivedPacket;
}
【问题讨论】:
-
“这会提高性能吗?” - 你的分析器会告诉你。我打赌你听说过过早优化
-
回复:编辑;你不能这样做,这是我在你编辑之前已经回答的。您需要存档实例。在答案中查看我的评论
标签: c++ serialization boost deserialization boost-asio