如果我创建一个保留 1kb 整数数组 int[1024] 的循环,并且我希望它分配 10000 个数组,我可以通过从多个线程运行内存分配来使其更快吗?
我希望它们在堆中。
假设我有一个多核处理器来完成这项工作。
我已经试过了,但是它降低了性能。我只是想知道,我是不是编写了错误的代码,还是我对内存分配一无所知?
答案是否取决于操作系统?如果可以,请告诉我它在不同平台上的工作原理。
编辑:
整数数组分配循环只是一个简化的例子。不要费心告诉我如何改进它。
最佳答案
这取决于很多事情,但主要是:
- 操作系统
- 你正在使用的
malloc
的实现
操作系统负责分配您的进程可以访问的“虚拟内存”,并构建一个将虚拟内存映射回实际内存地址的转换表。
现在,malloc
的默认实现通常是保守的,并且将简单地围绕所有这些设置一个巨大的锁。这意味着请求是串行处理的,唯一从多个线程而不是一个线程分配的东西会减慢整个过程。
还有更聪明的分配方案,通常基于池,它们可以在其他 malloc
实现中找到:tcmalloc
(来自 Google)和 jemalloc
(由 Facebook 使用)是为多线程应用程序中的高性能而设计的两个此类实现。
虽然没有 Elixir ,但有时操作系统必须执行虚拟 <=> 真正的翻译,这需要某种形式的锁定。
最好的办法是按竞技场分配:
- 一次分配大块(竞技场)
- 将它们分成适当大小的数组
没有必要并行化竞技场分配,你最好尽可能地请求最大的竞技场(请记住,太多的分配请求可能会失败),然后你可以并行化拆分.
tcmalloc
和 jemalloc
可能有点帮助,但是它们不是为大分配设计的(这是不寻常的),我不知道如果可以配置他们请求的竞技场的大小。
关于c++ - 我可以通过使用多线程更快地分配内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5933126/