【问题标题】:Major speed differences between static/stack and heap memory静态/堆栈和堆内存之间的主要速度差异
【发布时间】:2012-01-29 07:36:04
【问题描述】:

我遇到了一个问题,当内存被频繁重新分配时,访问存储在堆内存中的数据执行速度非常慢。

对比

什么可以解释这种行为?

【问题讨论】:

  • 不要发布文字图片。对于犯同样错误的其他问题,这将是一个有用的重复目标,但如果没有复制/粘贴(并且盲人可读等)形式的代码,则并非如此。

标签: objective-c ios performance memory ipad-2


【解决方案1】:

可能是页面错误问题。如果你 malloc 一大块 RAM,物理 RAM 可能不会立即分配,一些页表条目将被设置。在您第一次访问其中的位置之前,不会分配物理 RAM。这涉及到

  • 页面错误,
  • 寻找物理内存页
  • 将该页面上的每个位置归零
  • 更新页表

就时间而言,这是一项耗时的操作,并且每个分配的页面都会发生一次(您正在分配的 RAM 为 550 x 4kbyte 页面)

【讨论】:

  • 为什么我更频繁地重新分配块时会出现更多页面错误? iPad L2 缓存为 1MB,因此静态/堆栈内存也应发生页面错误。归零参数仅适用于 calloc-ed 内存。 Malloc 不会将内存归零。您能否在您的帖子中添加进一步的解释?
  • @Etan:大概它没有重用同一块内存,或者它在释放时将内存还给操作系统(内存在 iDevices 上是有限的,所以这绝对是一种可能性)。静态内存是永久分配的,而堆栈内存在第一次使用时可能会永久分配。
  • 所以基本上延迟分配是什么让我死在这里。这也解释了为什么 calloc 比 memset 或 {0} 初始化程序快得多。每次是否占用相同的内存块不应该改变页面错误的数量,因为即使在旧页面被重用的情况下,免费调用后页面也会变脏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-06
  • 2011-03-29
  • 2017-11-13
  • 2018-08-01
  • 2014-05-27
  • 2019-05-17
  • 2015-07-04
相关资源
最近更新 更多