Я реализую книгу заказов на с ++. Я моделирую его после этой реализации , которая получила награды за скорость.
Причина, по которой это быстро, объясняется использованием статических массивов, так что вся книга заказов размещается в стеке, а не в куче.
Что меня удивило, так это значительное повышение производительности при инициализации массивов с помощью bzero. Ниже приведена функция init
в связанной реализации c. Комментирование вызовов bzero
приводит к примерно в 2-3 раза более медленной производительности, когда я предоставляю им образцы данных и измеряю результаты.
void init() {
/* Initialize the price point array */
bzero(pricePoints, (MAX_PRICE + 1) * sizeof(pricePoint_t));
/* Initialize the memory arena */
bzero(arenaBookEntries, MAX_NUM_ORDERS * sizeof(orderBookEntry_t));
...
}
В моем коде C ++ мои статические массивы были записаны, как показано ниже. В C ++ 11 у меня сложилось впечатление, что установка массива = {}
инициализирует его нулевыми значениями. Следовательно, я не думал, что мне нужно будет использовать bzero
. Тестирование на примере данных показало, что моя реализация эквивалентна реализации c без bzero
. Добавление вызова bzero
в конструктор моего класса OrderBook
привело к производительности, эквивалентной реализации C.
Итак, мой вопрос: почему использование bzero
привело к более высокой производительности?
// header file
OrderBook {
static PricePoint _price_points[MAX_PRICE / TICK_SIZE];
static Order _orders[MAX_ORDERS];
}
//cpp file
PricePoint OrderBook::_price_points[MAX_PRICE / TICK_SIZE] = {}
Order OrderBook::_orders[MAX_ORDERS] = {};