数据结构局部性的含义是什么?

What is meaning of locality of data structure?

本文关键字:是什么 局部性 数据结构      更新时间:2023-10-16

我正在阅读以下文章,

每个程序员都应该知道的关于编译器优化的知识

目前还有其他重要的优化超出了 任何编译器的功能 — 例如,替换低效编译器 具有高效算法的算法,或更改数据的布局 结构以改善其局部性。

这是否意味着如果我更改类中数据成员的顺序(布局),它会影响性能?

所以

class One
{
int data0;
abstract-data-type data1;
};

性能不同于,

class One
{
abstract-data-type data0;
int data1;
};

如果这是真的,那么定义类或数据结构时的经验法则是什么?

从这个意义上说,局部性主要是指缓存局部性。编写数据结构和算法以主要在缓存中运行,使算法尽可能快地运行。缓存局部性是快速排序快速的原因之一。

对于数据结构,

您希望使数据结构中相互引用的部分彼此相对接近,以避免刷新有用的缓存行。

此外,您可以重新排列数据结构,以便编译器将使用保存所有成员并仍然有效地访问它们所需的最小内存量。这有助于确保数据结构占用最少的缓存行数。

当前 x86-64 架构(核心 i7)上的单个缓存行为 64 字节。

我不是数据/结构局部性方面的专家,但这与您如何组织数据以避免 CPU 从整个 CPU 缓存内存位有关,从而通过不断等待内存获取来减慢程序的速度。

例如,链表可以分散在你的记忆中。但是,如果您将其更改为"元素"数组,则它们都在连续内存中 - 如果您需要一次遍历所有数组,这将节省内存访问时间(这只是一个例子)

此外:还要注意一些 STL 库,同样我不能 100% 确定哪些是最好的,但其中一些(例如列表)在局部性方面非常糟糕。另一个,也许更常见的例子是指针数组,其中指向的元素可以分散在内存中。当然,您不能总是轻易避免这种情况,因为您有时需要能够动态添加/移动/插入/删除元素......

总结:它基本上意味着注意如何布局有关内存访问的数据。

按访问类成员的频率对类成员进行排序。这会最大化包含类头的缓存行的"热度",从而增加它保持缓存的可能性。您关心的另一个因素是打包 - 由于对齐,重新排列声明成员的顺序可能会导致类的大小减小,从而减少缓存压力。

(当然,它们都不是确定的。这些经验法则不能替代分析。