【问题标题】:Predicting size in memory of Dictionary in Swift在 Swift 中预测字典内存中的大小
【发布时间】:2016-07-03 09:43:13
【问题描述】:

考虑到它将包含的元素数量,它是否以某种方式记录了在 Swift 中将准确使用多少内存?

我一直在寻找答案,但我找到的关于该主题的所有信息都含糊不清。我也尝试通过阅读 Swift 的源代码自己弄清楚,但这对我来说太复杂了。

【问题讨论】:

标签: swift dictionary memory-footprint


【解决方案1】:

您可以检查declaration of Dictionary。这是一个相当大的文件,但看了一段时间后,我相信字典使用的字节数遵循以下限制:

bytes > (strideof(Key) + strideof(Value)) * 4/3 * capacity
bytes is a power of 2

我不能 100% 确定,因为如果没有自己编写,很难理解源代码。看看herehereherehere。可能可以自己编译它并在大小发生变化时输入prints,但我懒得这样做。为什么需要它的大小?

【讨论】:

  • 感谢您阅读源代码的指导——是的,很长!对我来说也很难理解;耐心。我想预测大小,因为我正在计划支持某些操作的数据结构,其中访问时间非常重要,但内存效率也很重要。我正在考虑的一种方法是使用许多“小”字典;但如果他们使用的内存比我想要的多(我怀疑这会发生),我将不得不寻找更好的方法。
  • @George 所有数据结构都有给定的访问时间和内存效率,对于字典和数组,访问在 O(1),内存使用是 O(n),但绝对值不是可用并且如果实施得到调整可能会改变。但是,数据结构不会占用过多的内存。如果你能告诉我你到底想做什么,我可以为你提供更多帮助。
  • 我不确定,但在尝试了一些事情之后,我认为你是正确的。
  • @George 这里有个思路:使用[UInt16]的数组来存储每块棋子的位置,当棋子不在场上时值为0xffff,否则第一个字节代表列,第二行。这样单板总是使用 32*2=64 字节的内存。可能您想要自己的Position 来处理底层UInt16 的获取和设置。 64 字节是非常小的内存,1MB 可以存储超过 15000 块板。
  • @George 它总是在内存使用和效率之间进行权衡:使用这个[UInt16] 数组,您的内存使用率很低,但您需要扫描数组以查找哪个部分位于某个位置。除了块数组,您还可以将板编码为[UInt8] 的二维数组,这意味着您也可以快速将块放在正方形上,但会占用额外的内存。
猜你喜欢
  • 2011-11-24
  • 2014-03-30
  • 2015-05-15
  • 2014-03-18
  • 1970-01-01
  • 2010-10-14
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多