在 youtube 剪辑中 光速交易:用 C++ 设计低延迟系统 - David Gross - Meeting C++ 2022 介绍如下:
std::unordered_map<InstrumentId, Instrument> mInstruments;
// Upsides: Contiguous memory, cheap lookup
// Downsides: Random memory access ("Linked list")
std::vector<Instrument> mInstruments;
std::unordered_map<InstrumentId, Instrument*> mInstruments;
// Upsides: Contiguous memory, cheap lookup
// Downsides: expensive resize which invalidates pointers
为什么这是一个改进?不是还有一个链表,只是现在用指针而不是完整的对象吗?所以你还有随机内存访问?
论点是,如果所有
Instruments
总大小都大于系统的缓存,则触发缓存未命中的随机访问将有很长的延迟。
在第二种情况下,unordered_map 只能随机访问指针,希望这些指针足够小以完全适合 L1 缓存,当所有数据都已经在 L1 缓存中(或至少如果指针可以放入 L2,会有一些小的延迟)。
乐器呢?你仍然会对它们进行缓存未命中,因为它们无法放入 L1 缓存,但现在你按顺序访问它们,允许 CPU 预取它们,CPU 将正确猜测它需要哪些数据,所以缓存未命中延迟减少了(对于现代硬件来说几乎是原来的十倍)。