我目前正在重构遗留代码,偶然发现了链表的这个奇怪的节点
#define CACHE_LINE 128
struct Node {
public:
intptr_t value;
Node *next;
Node *prev;
bool dummy;
private:
// Avoid false sharing
unsigned char padding[CACHE_LINE - sizeof(intptr_t) - 2 * sizeof(Node *) - sizeof(bool)];
};
假设我正在处理的系统的缓存行宽为32字节,这意味着该对象将占用多达4个缓存行(带有32字节缓存行)。其中3个将完全为空。
此链接列表是无锁队列的一部分。我尚未确定有多少生产者和多少消费者在使用它。在this other post中,答案指出以下内容:
一个澄清:对于负面影响,至少应写一些对“错误共享”变量的访问。如果很少写入,那么错误共享对性能的影响就可以忽略不计;写的越多(使高速缓存行使消息无效),性能越差。
我的问题如下:什么会使我的表现下降最多?在这个小对象上错误共享,还是我的缓存的四分之一将填充填充?
Compiler Explorer上的内存布局的实时表示