什么是提升序列化地图加载时间?
Posted
技术标签:
【中文标题】什么是提升序列化地图加载时间?【英文标题】:What is boost serialized map load time? 【发布时间】:2018-01-06 21:49:52 【问题描述】:如果地图在 boost 中是二进制序列化的,是加载 nlogn 的时间还是 n ?
如果 map 只是一次写入一个元素,那么加载 n 项似乎需要 nlogn,因为我们正在插入 n 项并且每个项都需要 logn 时间。
但我想知道是否可以以与内存布局和指针编组匹配的格式编写映射。所以加载它然后我认为需要 n 时间。本质上是正在加载内存布局。
有人有这方面的经验吗?
【问题讨论】:
时间不是以n
或nlogn
衡量的。如果你想测量实际时间,你只需要一些分析器或至少像 chrono::high_resolution_clock
这样的东西。
如果您包含代码,我们实际上可以建议改进性能的更改。现在我们甚至在猜测您的地图包含什么。没用
【参考方案1】:
我没有查看源代码,但是...
如果我正在为std::map
编写序列化代码,我会记得在写入数据时,它将按比较函数排序(通常是std::less
)。
然后我会记得std::map::insert
有一个版本,允许我指定关于从何处开始搜索插入点的提示。
回顾从档案中读取的数据是按“升序”顺序排列的,我需要做的就是:
while(read_count--)
std::pair<K,V> entry;
archive >> entry;
mymap.insert(std::end(mymap), entry);
所以实际上它是线性时间。
【讨论】:
【参考方案2】:就像理查德说的,但我更喜欢boost::container::flat_map
。这具有允许您插入已知已排序的范围的构造函数:http://www.boost.org/doc/libs/1_66_0/doc/html/boost/container/flat_map.html#idp38577632-bb
我认为默认序列化没有利用这一点,因此您可能希望基于此推出自己的序列化。
作为奖励:如果您的键/值对是自包含的和 POD,您可以将它们序列化。
【讨论】:
以上是关于什么是提升序列化地图加载时间?的主要内容,如果未能解决你的问题,请参考以下文章
Yaml-cpp(新 API):在序列中混合地图和标量的问题