微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

缓存局部性方面的数据存储效率

如何解决缓存局部性方面的数据存储效率

我想做一个像这样的数据存储:

  1. 我有一个结构数组,它们是某种智能指针。每个指针包含有关堆栈数组(包含所有对象的存储)中对象的位移、对象大小和持有者数量的信息:
struct ObjPtr {
    int disp;  // displacement
    int size;  // size of an object
    int count; // number of holders
}

// somewhere in code...
// Assume I can create only 1024 objects just for example.
ObjPtr* smart_pointers = (ObjPtr*)calloc(1024,sizeof(ObjPtr)); 
  1. 我有一个包含所有对象的堆栈数组:
// Assume 64 MB is enough
char* obj_stack = (char*)calloc(64 * 1024 * 1024,sizeof(char))
int stack_top; // displacement of the top of the obj_stack

它只是一个普通的字节数组。每个对象都在堆栈顶部分配,然后我们执行 stack_top += sizeof(allocated_type)。如果没有足够的内存,我们压缩 obj_stack完全无处不在在我的程序中我如何使用ObjPtr数组中smart_pointers索引而不是指针:

// Access an object:
SomeObject* some_object = (SomeObject*)(obj_stack + pointers[objPointer_index].disp)

请注意,我从诸如如何压缩堆栈、堆栈上的对象对齐、如何存储释放的智能指针的索引、计数器递增/递减的原子性、循环引用、智能指针的内存开销等问题中抽象出来,访问对象等期间的性能开销。

我害怕的问题是: 据我了解虚拟内存的工作原理,处理器不会从内存中检索几个字,而是尝试预测进一步的内存访问并加载更多内容并将其放入缓存。这称为局部性原则。我猜编译器提供的典型分配器试图保留局部性。这种存储的设计方式是将引用和对象存储在不同的页面上。这违反了局部性原则。但这是一个小问题。最大的问题是,从长远来看,经过多次压缩后,对象(一起工作,相互引用)可能会分布在整个堆栈数组中。所以我猜处理器会疯狂地从一页跳到另一页。这就像向量与链表缓存未命中。你怎么认为我的假设是正确的?我应该关心局部性和碎片化吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。