c++ - 我可以通过使用多线程更快地分配内存吗?

标签 c++ dynamic-memory-allocation

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

我希望它们在堆中。

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

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

答案是否取决于操作系统?如果可以,请告诉我它在不同平台上的工作原理。

编辑:

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

最佳答案

这取决于很多事情,但主要是:

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

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

现在,malloc 的默认实现通常是保守的,并且将简单地围绕所有这些设置一个巨大的锁。这意味着请求是串行处理的,唯一从多个线程而不是一个线程分配的东西会减慢整个过程。

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

虽然没有 Elixir ,但有时操作系统必须执行虚拟 <=> 真正的翻译,这需要某种形式的锁定。

最好的办法是按竞技场分配:

  • 一次分配大块(竞技场)
  • 将它们分成适当大小的数组

没有必要并行化竞技场分配,你最好尽可能地请求最大的竞技场(请记住,太多的分配请求可能会失败),然后你可以并行化拆分.

tcmallocjemalloc 可能有点帮助,但是它们不是为分配设计的(这是不寻常的),我不知道如果可以配置他们请求的竞技场的大小。

关于c++ - 我可以通过使用多线程更快地分配内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933126/

相关文章:

c++ - 今天使用二合字母和三合字母吗?

C++ 继承 : defining a pointer to either derived or base class

linux - 如何在 Linux 下使用汇编和系统调用动态分配内存

c - 关于动态分配内存给 char 指针的简单问题

c - 有时在保存有条件分配的内存的指针上使用free时程序崩溃

c - 如何在获取输入的同时在数字数组中创建实时动态内存分配?

c++ - 陷入循环等待状态。需要帮助才能出去

c++ - 所有 DES key 的生成和存储

堆栈上的 C++ 流多态性?

c - 如何从函数中使用 malloc?