将经常访问的数组地址放入缓存有什么好处?

问题描述 投票:0回答:1

最近我正在研究某人的限价订单簿实施。作者在一个地方留下了评论,我不太明白它对性能有何好处。

让我快速总结一下代码。它是用纯 C 语言编写的。

typedef struct orderBookEntry {
  t_size size;                     /* Order size                        */
  struct orderBookEntry *next;     /* Next entry in the pricePoint list */
  char trader[4];
} orderBookEntry_t; 

/* Statically-allocated memory arena for order book entries. This data 
   structure allows us to avoid the overhead of heap-based memory allocation. */
static orderBookEntry_t arenaBookEntries[MAX_NUM_ORDERS];

static orderBookEntry_t *arenaPtr;

...

vod init() {
  ...
  arenaPtr = arenaBookEntries;   // Bring the arena pointer into the cache
  ...
}

arenaPtr = arenaBookEntries;
这正是我对其性能优势感到非常困惑的地方。

因此,在整个程序中,它广泛地读取和写入静态分配的

arenaBookEntries[MAX_NUM_ORDERS]
。我的直觉是,由于频繁访问的性质,数组已经或多或少驻留在 L1 或 L2 cache 中,从而使读写速度更快,并且不需要频繁地访问 RAM 来获取。

我的猜测:是不是因为

*arenaPtr
是静态变量并且单独分配了它的位置(不在堆上也不在堆栈上),所以一旦加载它就会永远在那里?

完整源代码链接:https://github.com/YukunJ/LimitOrderBook/blob/main/wining_engine.c

c linux performance caching trading
1个回答
0
投票

这是一个有用的注释,因为它告诉您注释的作者不知道编译器和优化器是如何工作的。这意味着其他“改进”同样值得怀疑。

编译器已经需要将

arenaBookEntries
的地址存储在某处。添加
arenaPtr
意味着现在有两个地方可以存储相同的信息。使用更多内存对缓存来说是坏事,不好。

© www.soinside.com 2019 - 2024. All rights reserved.