为什么这种性能恶化?

时间:2016-10-21 07:12:40

标签: c++ performance memory 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;
};

但是因为我注意到我可以摆脱类成员p,因为我只需要在解析方法中使用它,我改变了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*);
};

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

我想知道这是如何可行的,因为应用程序已针对发布版本进行了全面的速度优化编译。这是因为论证传递了吗?是由于我struct Properties的堆栈分配?

更新

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

1 个答案:

答案 0 :(得分:0)

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

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

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