什么是boost序列化地图加载时间?

时间:2018-01-06 21:49:53

标签: c++ optimization serialization boost

如果地图在升级中是二进制激活的,那么加载nlogn的时间还是n?

如果map简单地一次写入一个元素,那么加载n个项目似乎需要nlogn,因为我们正在插入n个项目并且每个项目需要记录时间。

但是我想知道地图是否可以用与内存布局和marshelled指针匹配的格式编写。所以加载它然后我认为将需要n次。基本上正在加载内存布局。

有没有人有这方面的经验?

2 个答案:

答案 0 :(得分:1)

我没有查看源代码,但是......

如果我正在编写std::map的序列化代码,我会记得在编写数据时,它将由比较函数(通常为std::less)进行排序。

我会记得std::map::insert有一个允许我指定开始搜索插入点的位置提示的版本。

回想一下从档案中读取的数据是按升序排列的,我需要做的就是:

while(read_count--)
{
  std::pair<K,V> entry;
  archive >> entry;
  mymap.insert(std::end(mymap), entry);
}

所以实际上它将是线性时间。

答案 1 :(得分:0)

像理查德所说,但我更喜欢boost::container::flat_map。这个构造函数允许您插入已知的已经订购的范围:http://www.boost.org/doc/libs/1_66_0/doc/html/boost/container/flat_map.html#idp38577632-bb

我不认为默认序列化会利用这一点,因此您可能希望基于此推出自己的序列化。

作为奖励:如果您的键/值对是自包含的和POD,您可以将它们序列化。