我想对于任何进行性能研究的人来说,这都是一个非常普遍的情况。
假设其中有一些数据结构,并且想评估其空间性能-
不计入例如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;
}


图片:
c&#43;&#43; - massif-visualizer,用于分析多个数据结构-LMLPHP

当发生stack-> set过渡时,我可以看到明显的鸿沟。
但是,内存似乎没有完全释放-一个直观(也许天真)的期望会出现一些“跷跷板”图像。我们如何实现这种效果?我以为.reset()将调用堆栈的析构函数。我想是的,因为在图片的右半部分,工具提示会说
Rb_tree(即set<>)。我的问题是,massif工具中的哪个开关或代码中的哪种排列方式将产生更“直观”的图像?
当然,我可以为测试的每个数据结构编写相同的样板代码,但是我想将它们并列放置,以使它们的内存性能可轻松比较。

最佳答案

该图中有一个跷跷板。

绿色逐渐消失,蓝色逐渐消失。

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

关于c++ - massif-visualizer,用于分析多个数据结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59179072/

10-11 18:52