为什么这种性能恶化?

Nic*_*ick 7 c++ memory performance memory-management parameter-passing

我需要减少我的原生Windows C++应用程序使用的内存,而不会影响其性能.

我的主要数据结构由以下Line类的数千个动态分配的实例组成:

struct Properties
{
    // sizeof(Properties) == 28
};


// Version 1
class Line
{
    virtual void parse(xml_node* node, const Data& data)
    {
        parse_internal(node, data);
        create();
    }

    virtual void parse_internal(xml_node*, const Data&);
    void create();

    Properties p;
};
Run Code Online (Sandbox Code Playgroud)

但是因为我注意到我可以摆脱类成员p,因为我只需要在parse方法中,我改变了Line实现:

// Version 2
class Line
{
    virtual void parse(xml_node* node, const Data& data)
    {
        Properties p;

        parse_internal(node, data, &p);
        create(&p);
    }

    virtual void parse_internal(xml_node*, const Data&, Properties*);
    void create(Properties*);
};
Run Code Online (Sandbox Code Playgroud)

这减少了分配的几兆字节的内存,但它将经过的时间增加了50多毫秒.

我想知道如果考虑到应用程序已经完全基于速度优化的发布版本编译,这怎么可能.这是因为论证传递了吗?是因为我的堆栈分配struct Properties

更新:

Line::parse每个实例只调用一次该方法.该数据结构由组成std::vectorLine第 多个线程管理此向量的不同子集.

Han*_*son 0

你写的 parse_internal 是递归的。这意味着它在更改后的变体中获得 3 个参数,而不是原始版本中的 2 个参数 - 并且会递归调用几次。

您还必须使用指针语法而不是元素取消引用来访问成员(并且可能验证 Properties 指针是否为非空)。要消除指针问题,您可以使用 parse_internal 的引用参数。

是否有理由将 parse_internal 作为虚拟成员函数,或者您可以将其更改为静态(在修改后的变体中)?