#c #memory #c 14 #benchmarking
#c #память #c 14 #сравнительный анализ
Вопрос:
Я уже несколько часов измеряю производительность моего распределителя стека. Время выполнения при каждом запуске обычно почти одинаково, за исключением некоторых пик, которые очень большие. В текущем запуске я зарегистрировал падение производительности в 8 раз.
Распределитель стека — это, по сути, необработанный массив символов без знака, расположенный в стеке. Перераспределение сначала пытается расширить заданную память, и это всегда удается в этой настройке. Я использовал эту функцию для ее тестирования:
void stackalloc_benchmark(const current_type* data, std::size_t size)
{
stack_allocator<131072, alignof(current_type)> allocator; //exactly to fit size elements
block memory = allocator.allocate(sizeof(current_type) * 8);
for (std::size_t i = 0; i < size; i)
{
if (memory.size < sizeof(int) * i)
{
allocator.reallocate(memory, memory.size * 2);
}
*(to_type(memory.ptr) i) = *(data i); //to avoid wordy cast
}
allocator.deallocate(memory);
}
data
гарантируется правильное выравнивание, потому что оно происходит от std::vector<current_type>
. В распределителе также нет смещений, ошибка была исправлена вчера.
Я использую этот код для определения времени:
template <typename ... ArgTypes>
void measure(ArgTypesamp;amp; ... args)
{
auto start = std::chrono::high_resolution_clock::now();
functor(std::forward<ArgTypes>(args)...);
auto end = std::chrono::high_resolution_clock::now();
timings.push_back(end - start);
}
Настройка:
current_type = long long
, size = 8096
, runcount = 512
, VC 19.0024215.1, процессор: intel i7 2600, не уверен в частоте оперативной памяти. Выпуск сборки, x64, / 02, (максимальная скорость), Windows 10.
Цифры в основном составляли около 9-10 микросекунд, иногда доходя до 14. В одном месте это заняло до 72 микросекунд.
Мой вопрос: что может вызвать такое сильное падение производительности?
Комментарии:
1. Что еще запущено на компьютере?
2. @EdHeal, ничего. Я пытался отключить все, перезагрузиться, подождать минуту, а затем выполнить измерения. Даже без подключенного к нему отладчика MSVS есть некоторые проблемы. Программа печатает в файл csv.
3. @Olzhas если вы используете Windows 10, никогда ничего не запускается.
4. @CoffeeandCode, как я могу все отключить? Пока я далек от компьютерных лабораторий, попытаюсь протестировать его и на других машинах.
5. Вы измеряете такие малые времена — я бы подумал, что переключение контекста повлияет на эти тайминги.