【问题标题】:massif-visualizer for profiling multiple data structures用于分析多个数据结构的 massif-visualizer
【发布时间】:2020-03-29 10:27:55
【问题描述】:

我猜,对于任何进行性能研究的人来说,这是一个非常常见的场景。 假设有几个数据结构,并且想评估它们的空间性能—— 不计算使用例如sizeof 而是以经验的方式。 我在 MWE 中对这种情况建模如下:

  • 有一个 STL stack<in> 有一个 set<int>
  • 首先我创建 堆栈并将一些(随机)数字推入其中
  • 我删除了堆栈, 并将一些数字推入集合中
  • 我跑valgrind --tool-massif --max-steps=1000 --time-unit=ms main
  • 最后,我使用同名的“massif-visualizer”进行可视化

代码:

#include <set>
#include <stack>
#include <random>
#include <memory>
#include <functional>
using namespace std;

const int n= 42;
std::default_random_engine engine;
std::uniform_int_distribution<int> distribution(0,n-1);

int main() {
    unique_ptr<stack<int>> stck;
    unique_ptr<set<int>> st;

    auto dice= bind(distribution,engine);

    {
        // first try the stack
        stck = make_unique<stack<int>>();
        for (auto i = 0; i < 0x420; ++i)
            stck->push(dice());
        stck.reset();
    }
    {
        // then try the set
        st= make_unique<set<int>>();
        for (auto i = 0; i < 0x420; ++i)
            st->insert(dice());
        st.reset();
    }
    return 0;
}

图片:

当 stack->set 转换发生时,我可以看到明显的划分。 然而,内存并没有完全释放,似乎——直觉上(也许天真地)会期待一些“跷跷板”的形象。我们如何达到这个效果?我假设.reset() 会调用堆栈的析构函数。我想是的,因为在图像的右半部分,工具提示会说话 仅限Rb_tree(即set&lt;&gt;)。我的问题是,massif 工具中的哪个开关或我的代码中的哪种排列会产生更“直观”的图像? 当然,我可以为我测试的每个数据结构编写相同的样板代码,但我想将它们并置,以便它们的内存性能易于比较。

【问题讨论】:

    标签: c++ valgrind massif


    【解决方案1】:

    在该图中有一个跷跷板。

    绿色逐渐消失,让位于蓝色。

    这很难发现,因为大部分堆使用量(橙色)被开销(标准库等)占用,这让容器占用的内存相形见绌。

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 2020-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多