我可以使用多线程更快地分配内存吗?

0xb*_*00d 6 c++ dynamic-memory-allocation

如果我创建一个保留 1kb 整数数组 int[1024] 的循环,并且我希望它分配 10000 个数组,我可以通过从多个线程运行内存分配来使其更快吗?

我希望它们在堆中。

让我们假设我有一个多核处理器来完成这项工作。

我已经尝试过这个,但它降低了性能。我只是想知道,我只是编写了错误的代码还是我对内存分配不了解?

答案是否取决于操作系统?如果是这样,请告诉我它在不同平台上的工作方式。

编辑:

整数数组分配循环只是一个简化的例子。不要打扰告诉我如何改进它。

Mat*_* M. 6

这取决于很多因素,但主要是:

  • 操作系统
  • malloc你正在使用的实施

操作系统负责分配进程可以访问的“虚拟内存”,并构建一个将虚拟内存映射回实际内存地址的转换表。

现在,默认实现malloc通常是保守的,并且只会对所有这些进行巨大的锁定。这意味着请求是串行处理的,从多个线程而不是一个线程进行分配的唯一作用是减慢整个过程。

还有更聪明的分配方案,通常基于池,并且可以在其他malloc实现中找到它们:(tcmalloc来自 Google)和jemalloc(由 Facebook 使用)是两种专为多线程应用程序中的高性能而设计的实现。

不过,没有什么灵丹妙药,在某一时刻,操作系统必须执行虚拟 <=> 真实转换,这需要某种形式的锁定。

最好的选择是按领域分配:

  • 一次分配大块(区域)
  • 将它们分成适当大小的数组

不需要并行化竞技场分配,并且您最好请求尽可能大的竞技场(请记住,太大的分配请求可能会失败),然后您可以并行化分割。

tcmalloc并且jemalloc可能会有所帮助,但是它们并不是为分配而设计的(这是不寻常的),而且我不知道是否可以配置它们请求的竞技场的大小。