我目前正在编写一个缓存模拟器,并且正在考虑为该特定应用程序使用哪个容器。
我必须从文件中读取内存,该文件包含以下格式的数据:
[instruction] [32 bit address] [amount of instructions since previous data memory access]
示例:
s 0x1fffff78 1
指令始终为's'或'l',文件范围为1 kB至10 MB。
我正在考虑使用Map,因此可以将指令与地址配对。但是,据我所知,通过检索和插入操作,Map的速度并不快,这违背了缓存的目的。
向量是我的第二选择,但这将使分离三个字段更加困难。如果文件很小,我将使用成对向量,但是事实并非如此。另外,由于我需要按内存地址进行搜索,因此这似乎不是正确的选择。
我应该使用地图,矢量还是有更快/更好的选择?
答案 0 :(得分:4)
我正在考虑使用Map,因此可以将指令与地址配对。但是,据我所知,通过检索和插入操作,Map的速度并不快,这违背了缓存的目的。
std::map
通常比您编写用于处理它的代码快得多。如果使用磁盘中的数据填充它,则尤其如此。 请使用std::map
。如果出现性能问题,请对您的代码进行概要分析,然后返回一个包含分析结果的问题。
答案 1 :(得分:0)
最容易编程和使用的可能是开箱即用的std::unordered_map
。如果您确实确实需要调整性能的每一个部分,那么您不断排序并使用std::vector
进行查找的std::lower_bound
可能会更快,即使是在中间插入也是如此。这是因为线性连续存储器只是超快的。例如,如果改进了地图类,将来可能会改变。
例如,请参阅此帖子以获取一些基准测试: https://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html