【问题标题】:Does allocation size affect its speed?分配大小会影响其速度吗?
【发布时间】:2013-09-08 12:30:59
【问题描述】:

我的意思是 - 分配小内存块比分配大内存块更快吗?即:

int * dummy = new int;    // A
int * dummy2 = new int[2];    // A
int * dummy3 = new int[1000000];    // B
VeryVeryBigStruct * dummy4 = new VeryVeryBigStruct;    // B

(A) 是小分配,(B) 是大分配。

我知道我可以编写一个简单的程序并自己测试它,但我实际上尝试过,甚至QueryPerformanceCounter() 也返回了0 单个小分配的时间(这有点令人惊讶,因为所有分配都应该如此缓慢。此外, 1 台计算机上的 1 次测试几乎不可靠,所以我想听听你对此事的了解。

另外,我想知道 10 次分配 N 字节是否比分配 1 次 10 * N 字节快/慢(我会说它应该更慢,但谁知道呢)。

【问题讨论】:

  • 请注意,任何答案都必须对内存分配的内部进行一些重要的假设,这使得它们成为特定于实现的,即使 如果这些假设对于几乎所有实现都是正确的的new/new[]/malloc。内存分配器的 /design 空间是巨大的,对于任何可能的答案,我都可以很容易地构思出一个答案不适用的内存分配器——尽管它们中的大多数对于实际代码来说都很糟糕。
  • 我想知道您是否在测试中使用了优化选项。
  • 底层内存管理器通常一次分配大块内存(例如,类 Unix 系统上的 页面,大小可能约为 4kB)。少量分配可能适合现有页面,因此速度很快。
  • Windows 上的分配速度非常快,它们只是分配虚拟内存。它不需要任何费用。在您真正访问内存之前,您不会开始付费。此时,您将引发页面错误以将内存映射到 RAM。
  • @HansPassant 另一方面,必须设置页表和虚拟机结构,对吗?您保留的页面越多,它们可能越贵。

标签: c++ performance memory-management


【解决方案1】:

取决于操作系统。不过总的来说,它不应该有很大的不同,因为像 Linux 之类的系统(我假设是现代 Windows 等)使用惰性分配。也就是说,它们在您访问它之前分配虚拟内存空间而不实际分配物理内存。

您可以在其他 SO 帖子中查看更多详细信息:

Does malloc lazily create the backing pages for an allocation on Linux (and other platforms)?

【讨论】:

  • 那么实际的物理分配发生在第一次访问期间?如果是这样,我想知道关于实际分配的问题的答案。
  • @NPS 分配发生在每页的基础上。如果你做dummy3[12345]=OxDEADBEEF,那么此时只会分配该地址所在的一页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多