【发布时间】:2011-06-13 10:54:24
【问题描述】:
我的问题与五年前在this thread 中讨论的问题相同(没有好的答案)。
我正在将我的对象序列化到一个字节缓冲区中,如下所示:
std::string serial_str;
for (i = 1; i < 10000; i++)
{
boost::iostreams::back_insert_device<std::string> inserter(serial_str);
boost::iostreams::stream<boost::iostreams::back_insert_device<std::string> > s(inserter);
boost::archive::binary_oarchive oa(s);
oa << obj;
s.flush();
// code to send serial_str's content to another process, omitted.
serial_str.clear(); // clear the buffer so it can be reused to serialize the next object
}
当我在循环中执行此操作时,性能非常糟糕:我每秒获得约 14,000 个对象。
我已将问题归结为 binary_oarchive 的重新创建。如果我只是在循环中使用相同的存档实例写入相同的字符串,我会得到 ~220,000 个对象/秒,但是,对象会一个接一个地序列化,这不是我想要的:我想清除并在每个对象被序列化后重用相同的缓冲区(寻找它的开头)。
我该怎么做?
【问题讨论】:
-
那么,如果您要在写入内容后立即丢弃其内容,那么拥有缓冲区有什么意义呢?
-
循环中究竟包含什么?如果您声明
serial_str也不必清除它,因为它是在每个循环中创建的。 -
@Tomalak 抱歉,我应该提到在序列化每个对象之后,我使用 boost::interprocess::message_queue 将其内容发送到另一个进程。
-
@Omer:啊哈!是的,你应该有。 :)
-
@Diego @Tomalak 抱歉,我已经更新了我的代码来解决这些问题。
标签: c++ performance boost boost-serialization