ptmalloc 引起的性能问题?

performance problems cause by ptmalloc?

提问人:szh 提问时间:3/15/2023 最后编辑:szh 更新时间:3/15/2023 访问量:68

问:

我正在测试 std::forward_list 排序性能,生成 1000000 个随机数并插入 std::forward_list,排序 5 次

#include <forward_list>
#include <chrono>
#include <random>
#include <iostream>
#include <vector>

int main()
{
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<int> dis(-100000000, 100000000);
    std::vector<int> v;
    for (int i = 0; i < 1000000; ++i) {
        v.push_back(dis(gen));
    }
    std::forward_list<int> *list;
    for (int j = 0; j < 5; ++j) {
        auto list = new std::forward_list<int>();
        for (auto it = v.begin(); it != v.end(); ++it) {
            list->insert_after(list->cbefore_begin(), *it);
        }
        auto start = std::chrono::steady_clock::now();
        list->sort();
        auto end = std::chrono::steady_clock::now();
        std::chrono::duration<double> diff = end - start;
        std::cout << diff.count() << " s\n";
        delete list;
    }
}

编译此代码并运行,获取输出g++ test2.cpp -o test2 -O2

0.994629 s
3.01309 s
2.98853 s
2.99701 s
3.01637 s

如果使用 tcmalloc,则编译此代码并运行,获取输出g++ test2.cpp /usr/local/lib/libtcmalloc_minimal.a -o test2 -O2

0.551351 s
0.550282 s
0.590626 s
0.613431 s
0.559123 s

如果删除代码,编译并运行,则得到输出delete list;g++ test2.cpp -o test2 -O2

0.893076 s
0.952251 s
0.95971 s
0.931195 s
0.922877 s

所以我认为tcmalloc可能会导致一些性能问题?

C++ 性能 malloc tcmalloc

评论

0赞 PaulMcKenzie 3/15/2023
g++ test2.cpp -o test2-- 对未优化的构建进行计时是没有意义的。启用优化、重新生成并计时优化生成。
0赞 Brian61354270 3/15/2023
禁用优化的性能比较几乎毫无意义。启用优化时会发生什么(例如?-O2
1赞 Brian61354270 3/15/2023
你在这里的使用方式有些不对劲。为什么声明 in 只是为了在 for 循环中使用不同的变量来隐藏它?为什么使用 new/delete 动态分配 s,而不仅仅是在 for 循环的块中创建具有自动存储的实例?listlistmainstd::forward_list
0赞 alfC 3/15/2023
你说删除列表会增加时间吗?它是否也适用于普通的 malloc?我也有经验,池分配器可以将一些成本推迟到销毁(实际上是取消分配),但这在某种程度上是意料之中的,因为有不平凡的簿记工作要做。
1赞 paddy 3/15/2023
您可能需要您的程序产生副作用,以确保有意义的结果。否则,整个事情可能会被优化掉......例如:.另一个考虑因素是,其中一个分配器是否比另一个分配器生成更高效的缓存内存布局。std::cout << std::is_sorted(list.begin(), list.end());

答: 暂无答案