- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让我的代码更快一些,并且我正在尝试通过更好地管理存储在对象和其他东西中的数组来找出我是否可以获得一些性能。
所以这背后的基本思想是我倾向于为临时和永久状态保留单独的数组。这意味着它们必须一直单独索引,每次我想使用它们时都必须显式写入正确的成员名称。
这是具有此类数组的特定类的样子:
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/
我有以下 div 结构。 和下面的 CSS .profile_outer { border: 2px solid #660000; -moz-border-radius:
在我的服务器上托管了两个网站(比如 abc.com 和 test.xyz.com) 我正在尝试为 test.xyz.com 重建数据库,并在此过程中 1.我删除了与之相关的数据库。2.停止mysql(
我是一名优秀的程序员,十分优秀!