数据结构局部性的含义是什么?
What is meaning of locality of data structure?
我正在阅读以下文章,
每个程序员都应该知道的关于编译器优化的知识
目前还有其他重要的优化超出了 任何编译器的功能 — 例如,替换低效编译器 具有高效算法的算法,或更改数据的布局 结构以改善其局部性。
这是否意味着如果我更改类中数据成员的顺序(布局),它会影响性能?
所以
class One
{
int data0;
abstract-data-type data1;
};
性能不同于,
class One
{
abstract-data-type data0;
int data1;
};
如果这是真的,那么定义类或数据结构时的经验法则是什么?
从这个意义上说,局部性主要是指缓存局部性。编写数据结构和算法以主要在缓存中运行,使算法尽可能快地运行。缓存局部性是快速排序快速的原因之一。
对于数据结构,您希望使数据结构中相互引用的部分彼此相对接近,以避免刷新有用的缓存行。
此外,您可以重新排列数据结构,以便编译器将使用保存所有成员并仍然有效地访问它们所需的最小内存量。这有助于确保数据结构占用最少的缓存行数。
当前 x86-64 架构(核心 i7)上的单个缓存行为 64 字节。
我不是数据/结构局部性方面的专家,但这与您如何组织数据以避免 CPU 从整个 CPU 缓存内存位有关,从而通过不断等待内存获取来减慢程序的速度。
例如,链表可以分散在你的记忆中。但是,如果您将其更改为"元素"数组,则它们都在连续内存中 - 如果您需要一次遍历所有数组,这将节省内存访问时间(这只是一个例子)
此外:还要注意一些 STL 库,同样我不能 100% 确定哪些是最好的,但其中一些(例如列表)在局部性方面非常糟糕。另一个,也许更常见的例子是指针数组,其中指向的元素可以分散在内存中。当然,您不能总是轻易避免这种情况,因为您有时需要能够动态添加/移动/插入/删除元素......
总结:它基本上意味着注意如何布局有关内存访问的数据。
按访问类成员的频率对类成员进行排序。这会最大化包含类头的缓存行的"热度",从而增加它保持缓存的可能性。您关心的另一个因素是打包 - 由于对齐,重新排列声明成员的顺序可能会导致类的大小减小,从而减少缓存压力。
(当然,它们都不是确定的。这些经验法则不能替代分析。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 文件系统:复制功能的速度秘诀是什么
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 是什么原因导致它无法编译?它是声明签名还是在函数本身的实现中
- 数据结构局部性的含义是什么?