【发布时间】:2016-08-30 08:47:45
【问题描述】:
据我了解,存在许多不同的 malloc 实现:
- dlmalloc – 通用分配器
- ptmalloc2 – glibc
- jemalloc – FreeBSD 和 Firefox
- tcmalloc – 谷歌
- libumem – Solaris
有什么方法可以确定我的 (linux) 系统上实际使用了哪个 malloc?
我读到“由于 ptmalloc2 的线程支持,它成为了 linux 的默认内存分配器。”有什么办法让我自己检查一下吗?
我之所以这么问,是因为我似乎没有通过在下面的代码中并行化我的 malloc 循环来加快速度:
for (int i = 1; i <= 16; i += 1 ) {
parallelMalloc(i);
}
void parallelMalloc(int parallelism, int mallocCnt = 10000000) {
omp_set_num_threads(parallelism);
std::vector<char*> ptrStore(mallocCnt);
boost::posix_time::ptime t1 = boost::posix_time::microsec_clock::local_time();
#pragma omp parallel for
for (int i = 0; i < mallocCnt; i++) {
ptrStore[i] = ((char*)malloc(100 * sizeof(char)));
}
boost::posix_time::ptime t2 = boost::posix_time::microsec_clock::local_time();
#pragma omp parallel for
for (int i = 0; i < mallocCnt; i++) {
free(ptrStore[i]);
}
boost::posix_time::ptime t3 = boost::posix_time::microsec_clock::local_time();
boost::posix_time::time_duration malloc_time = t2 - t1;
boost::posix_time::time_duration free_time = t3 - t2;
std::cout << " parallelism = " << parallelism << "\t itr = " << mallocCnt << "\t malloc_time = " <<
malloc_time.total_milliseconds() << "\t free_time = " << free_time.total_milliseconds() << std::endl;
}
这给了我一个输出
parallelism = 1 itr = 10000000 malloc_time = 1225 free_time = 1517
parallelism = 2 itr = 10000000 malloc_time = 1614 free_time = 1112
parallelism = 3 itr = 10000000 malloc_time = 1619 free_time = 687
parallelism = 4 itr = 10000000 malloc_time = 2325 free_time = 620
parallelism = 5 itr = 10000000 malloc_time = 2233 free_time = 550
parallelism = 6 itr = 10000000 malloc_time = 2207 free_time = 489
parallelism = 7 itr = 10000000 malloc_time = 2778 free_time = 398
parallelism = 8 itr = 10000000 malloc_time = 1813 free_time = 389
parallelism = 9 itr = 10000000 malloc_time = 1997 free_time = 350
parallelism = 10 itr = 10000000 malloc_time = 1922 free_time = 291
parallelism = 11 itr = 10000000 malloc_time = 2480 free_time = 257
parallelism = 12 itr = 10000000 malloc_time = 1614 free_time = 256
parallelism = 13 itr = 10000000 malloc_time = 1387 free_time = 289
parallelism = 14 itr = 10000000 malloc_time = 1481 free_time = 248
parallelism = 15 itr = 10000000 malloc_time = 1252 free_time = 297
parallelism = 16 itr = 10000000 malloc_time = 1063 free_time = 281
【问题讨论】:
-
这取决于您链接的库(库)。默认值可能是 glibc 中的那个——你必须努力确保你使用的是另一个版本。此外,C++ 使用
new和delete(和变体);它们不一定与malloc()和free()绑定。 -
XY 问题?你为什么在乎?
-
@SergeyA 我很在意,因为我想确保我使用支持多线程 w.r.t 的 malloc。性能。
-
您应该在开始尝试换出分配器之前分析您的代码以确定瓶颈的确切位置
-
@Captain Obvlious 好吧,我的代码是#pragma omp parallel for for (int i = 0; i
标签: c++ malloc heap-memory