gpt4 book ai didi

c++ - 对象大小如何影响 C++ 中的数组性能?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:25:12 25 4
gpt4 key购买 nike

#include <iostream>
#include <unistd.h>


using namespace std;


struct object
{
int i;
int j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
};

object *objectArray;
const int arraySize = 1920 * 1080;

int main()
{
objectArray = new object[arraySize];

while (1)
{
for (int i = 0; i < arraySize; i++)
{
objectArray[i].i = 1234;
}

sleep(1);
}

return 0;
}

我用上面的代码来测试这个。我用以下代码编译了这个程序:

g++ -O3 -std=c++14 src/main.cpp -o bin/main

在当前状态下,for 循环完成大约需要 15 - 20 毫秒。

当结构对象看起来像这样时,

struct object
{
int i;
}

for 循环大约需要 0.8 - 1.2 毫秒才能完成。

当我什至没有访问所有成员时,结构对象的大小如何以及为什么会影响性能?

最佳答案

现代桌面 CPU 具有分层内存:通过一系列缓存(例如 L2 和 L1 缓存)访问主内存,这些缓存越来越小,速度越来越快。以前从未见过的数据首先加载到缓存中,然后从那里加载到 CPU 寄存器中,结果存储回缓存中。缓存仅在稍后写回内存。

如果多个操作都影响缓存中的数据,那么在一组操作结束时只需要一次写回内存,这比每个操作直接访问主内存要快得多。

此外,内存以大块的形式传入和传出缓存,称为缓存线。典型的缓存行大小为 64 字节或 128 字节。

所以当你的类(class)是 { int i; },然后访问数组的第一个元素已经将许多后续对象带入缓存,并且只需从主内存中获取一次即可执行多个操作。当类很大时,一个缓存行仅包含一个数组元素的 i 成员,因此您需要为每个数组元素访问主内存。

现代处理器试图预测您接下来可能需要哪个主内存并开始推测性地获取数据,但访问主内存的速度仍然比访问缓存慢几个数量级,因此具有高步幅的数组操作要昂贵得多。

正是出于这个原因,在优化代码(和数据!)以提高性能时考虑访问模式非常重要。这是您考虑“结构数组”与“数组结构”的地方。或者,正如常识所说,“大多数时候,性能问题是数据结构选择不当的结果”。

关于c++ - 对象大小如何影响 C++ 中的数组性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41075298/

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