Vor Kurzem schaue ich mir die Implementierung des Limit Order Book von jemandem an. An einer Stelle hat der Autor einen Kommentar hinterlassen, und ich verstehe nicht ganz, wie sich das auf die Leistung auswirken soll.
Lassen Sie mich den Code kurz zusammenfassen. Es ist in reinem C geschrieben.
Code: Select all
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
...
}
Das ist genau der Punkt, an dem ich hinsichtlich der Leistungsvorteile sehr verwirrt bin.
Also liest und schreibt es im gesamten Programm in die statisch zugewiesenen arenaBookEntries[MAX_NUM_ORDERS] ausführlich. Meine Intuition ist, dass sich das Array aufgrund des häufigen Zugriffs bereits mehr oder weniger im L1- oder L2-
Cache befindet, wodurch Lese- und Schreibvorgänge schneller werden und seltener zum Abrufen in den RAM gewechselt werden muss.< /p>
Meine Vermutung: Liegt es daran, dass *arenaPtr eine statische Variable ist und ihr Platz separat zugewiesen wird (nicht auf dem Heap und nicht auf dem Stapel), sodass sie immer einmal dort sein wird? geladen?
Vollständiger Quellcode Link:
https://github.com/YukunJ/LimitOrderBoo ... g_engine.c
Vor Kurzem schaue ich mir die Implementierung des Limit Order Book von jemandem an. An einer Stelle hat der Autor einen Kommentar hinterlassen, und ich verstehe nicht ganz, wie sich das auf die Leistung auswirken soll.
Lassen Sie mich den Code kurz zusammenfassen. Es ist in reinem C geschrieben.
[code]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
...
}
[/code]
[code]arenaPtr = arenaBookEntries;[/code] Das ist genau der Punkt, an dem ich hinsichtlich der Leistungsvorteile sehr verwirrt bin.
Also liest und schreibt es im gesamten Programm in die statisch zugewiesenen arenaBookEntries[MAX_NUM_ORDERS] ausführlich. Meine Intuition ist, dass sich das Array aufgrund des häufigen Zugriffs bereits mehr oder weniger im L1- oder L2-[b]Cache[/b] befindet, wodurch Lese- und Schreibvorgänge schneller werden und seltener zum Abrufen in den RAM gewechselt werden muss.< /p>
Meine Vermutung: Liegt es daran, dass *arenaPtr eine statische Variable ist und ihr Platz separat zugewiesen wird (nicht auf dem Heap und nicht auf dem Stapel), sodass sie immer einmal dort sein wird? geladen?
Vollständiger Quellcode Link: https://github.com/YukunJ/LimitOrderBook/blob/main/winning_engine.c