最近我正在研究某人的限价订单簿实施。作者在一个地方留下了评论,我不太明白它对性能有何好处。
让我快速总结一下代码。它是用纯 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
这是一个有用的注释,因为它告诉您注释的作者不知道编译器和优化器是如何工作的。这意味着其他“改进”同样值得怀疑。
编译器已经需要将
arenaBookEntries
的地址存储在某处。添加 arenaPtr
意味着现在有两个地方可以存储相同的信息。使用更多内存对缓存来说是坏事,不好。