【问题标题】:What is meaning of locality of data structure?数据结构的局部性是什么意思?
【发布时间】:2015-04-03 15:02:00
【问题描述】:

我正在阅读以下文章,

What Every Programmer Should Know About Compiler Optimizations

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

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

所以,

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

性能不同,

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

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

【问题讨论】:

标签: c++ performance visual-c++ memory compiler-optimization


【解决方案1】:

Locality 在这个意义上主要是指cache locality。编写数据结构和算法以大部分在缓存之外运行,使算法尽可能快地运行。缓存位置是快速排序快速的原因之一。

对于数据结构,您希望保持数据结构中相互引用的部分相对靠近,以避免刷新有用的缓存行。

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

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

【讨论】:

    【解决方案2】:

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

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

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

    总结: 这基本上意味着要注意如何在内存访问方面布局数据。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 1970-01-01
        • 2011-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-13
        • 1970-01-01
        相关资源
        最近更新 更多