【问题标题】:C++ which container to use for storing cache memoryC++ 使用哪个容器来存储缓存内存
【发布时间】:2018-11-27 13:17:28
【问题描述】:

我目前正在编写一个缓存模拟器,并且正在考虑为这个特定的应用程序使用哪个容器。

我必须从一个文件中读取内存,该文件包含以下格式的数据:

[instruction] [32 bit address] [amount of instructions since previous data memory access]

示例:

s 0x1fffff78 1

指令始终为“s”或“l”,文件大小从 1 kB 到 10 MB。

我正在考虑使用 Map,因此我可以将指令与地址配对。但是据我所知,地图在检索和插入方面并不是很快,这违背了缓存的目的。

向量是我的第二选择,但这会使分离三个字段更加困难。如果文件仍然很小,我会使用成对的向量,但事实并非如此。此外,由于我需要按内存地址搜索,这似乎不是正确的选择。

我应该使用地图、矢量还是有更快/更好的替代方法?

【问题讨论】:

  • 不清楚为什么使用矢量会很困难。一般来说,说 vector 比 map 或其他方式更快是毫无意义的。您是否需要在恒定时间内在给定索引处进行随机访问,或者您是否需要在恒定时间内找到给定键的值?这应该是推动决策的原因
  • 考虑到它是一个缓存,我需要在恒定时间内按地址查找值作为键。我编辑了我的问题以反映这一点
  • 你能有几个相同的地址吗?文件中的顺序重要吗?
  • 可以有相同的地址,是的。文件顺序不重要

标签: c++ performance stl


【解决方案1】:

我正在考虑使用 Map,因此我可以将指令与地址配对。但是据我所知,地图在检索和插入方面并不是很快,这违背了缓存的目的。

std::map 通常比您为处理它而编写的代码要快得多。如果您使用磁盘中的数据填充它,则尤其如此。 请使用std::map。如果发生性能问题,请分析您的代码并返回包含分析结果的问题。

【讨论】:

  • std::unordered_map 也是一种选择。
  • 很好的一点是磁盘访问更有可能成为瓶颈。仅这一点实际上就比我的回答更好。
【解决方案2】:

最容易编程和使用的可能只是开箱即用的std::unordered_map。如果您真的需要调整每一点性能,那么您保持排序并使用std::lower_bound 进行查找的std::vector 可能会更快,即使对于中间的插入也是如此。这是因为线性连续内存非常快。如果地图类得到改进,这可能会在未来发生变化。

例如查看这篇文章以获得一些基准: https://baptiste-wicht.com/posts/2012/12/cpp-benchmark-vector-list-deque.html

【讨论】:

    猜你喜欢
    • 2019-09-22
    • 2013-07-15
    • 1970-01-01
    • 2021-08-14
    • 1970-01-01
    • 2023-03-26
    • 2020-02-25
    • 1970-01-01
    • 2022-08-18
    相关资源
    最近更新 更多