gpt4 book ai didi

c++ - 将类成员数组组合到单个数组时性能受到影响

转载 作者:行者123 更新时间:2023-11-30 05:05:33 24 4
gpt4 key购买 nike

我正在尝试让我的代码更快一些,并且我正在尝试通过更好地管理存储在对象和其他东西中的数组来找出我是否可以获得一些性能。

所以这背后的基本思想是我倾向于为临时和永久状态保留单独的数组。这意味着它们必须一直单独索引,每次我想使用它们时都必须显式写入正确的成员名称。

这是具有此类数组的特定类的样子:

class solution
{
public:

//Costs
float *cost_array;
float *temp_cost_array;
//Cost trend
float *d_cost_array;
float *temp_d_cost_array;

...

}

现在,由于我有根据输入参数在临时或永久状态上工作的函数/方法,它们看起来像这样:

void do_stuff(bool temp){
if (temp)
work_on(this->temp_cost_array);
else
work_on(this->cost_array);
}

这些是此类分支的非常简单的示例。这些数组可以在代码中的各处单独索引。正因为这样的东西到处都是,我认为这是将所有东西组合起来的另一个原因,这样我也可以摆脱那些代码分支。

所以我将我的类(class)转换为:

class solution
{
public:

//Costs
float **cost_array;
//Cost trend
float **d_cost_array;
...

}

那些 double 组的大小为 2,每个元素都是一个 float* 数组。这些在程序开始时的对象创建期间仅动态分配一次,并在程序结束时删除。

所以在那之后我也像这样转换了我代码的所有临时分支:

void do_stuff(bool temp){
work_on(this->cost_array[temp]);
}

它看起来比以前优雅多了,但由于某种原因,性能比以前差了很多(几乎差了 2 倍),我真的不明白为什么会这样。

因此,作为第一个见解,我真的很想听听更有经验的人的意见,看看我的代码优化背后的理由是否有效。

访问每个数组所需的额外索引是否会引入如此重大的性能损失以克服所有 if 分支和其他问题?当然,这取决于整个事情是如何工作的,但代码是一头野兽,我不知道如何正确地综合分析那件事。

谢谢

编辑:

环境设置:在 Windows 10、VS 2017 上运行,启用全面优化 (/Ox)

最佳答案

造成如此巨大性能下降的原因可能是随着我们引入了另一层间接访问,这可能会显着降低程序速度。

更改前的对象:

*array -> data[]
*temp_array -> data[]

假设对象(即 this)在 CPU 缓存中,在更改之前您有一个缓存未命中:从缓存中获取任何一个指针(缓存命中)并访问冷数据(缓存小姐)。

改变后的对象:

**array -> * -> data[]
* -> data[]

现在我们必须访问指向数组的指针(缓存命中),然后索引冷数据(缓存未命中),然后访问冷数据(另一个缓存未命中)。

当然,这是上面描述的最糟糕的情况,但可能就是这种情况。

修复非常简单:使用float *cost_array[2] 在对象中分配这些指针,而不是动态分配,即:

*array[2] -> data[]
-> data[]

因此在存储和间接级别方面,这与更改之前的原始数据结构完全对应,并且应该表现得完全相同。

关于c++ - 将类成员数组组合到单个数组时性能受到影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48288202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com