Каков источник выбросов в этом тесте C++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Каков источник выбросов в этом тесте C++?

Сообщение Anonymous »

Я запускаю этот код на C++, измеряя очень короткий интервал времени, необходимый для сложения двух чисел в Ubuntu 22.04. Меня не волнуют сами измерения, поскольку это неподходящий метод для измерения времени одной инструкции, но меня волнует повторяемость. Вот код:

Код: Выделить всё

int main() {
constexpr int n = 10'000'000;

vector timings;
int64_t       result = 0;

timings.reserve(n+1);

for (int i = 0; i < n; i++) {
auto t0 = high_resolution_clock::now();
result += i;
auto t1 = high_resolution_clock::now();
timings.push_back(duration{t1-t0}.count());
}

sort(timings.begin(), timings.end());
println("\nmin: {:.3f}us  med: {:.3f}us  99%: {:.3f}us  max: {:.3f}us  {}\n",
timings[0], timings[timings.size()/2], timings[99*timings.size()/100], timings.back(), result);

for (int i = timings.size()-9; i < timings.size(); i++)
println("{:.3f} ", timings[i]);
}
Он производит:

Код: Выделить всё

min: 0.020us  med: 0.020us  99%: 0.030us  max: 181.702us  49999995000000

104.366
107.432
138.891
140.454
142.368
143.409
145.293
150.453
181.702
Существует множество выбросов, которые в 5 тысяч раз длиннее медианы. Каков их источник? Это накладные расходы на вызов high_solve_lock::now()? Переключение контекста ОС между вызовами high_solve_lock::now()?

Чтобы уточнить. Я не использую набор микробенчмаркинга, поскольку, как указано выше, меня не волнует, сколько времени займет результат += i. Это заполнитель для чего-то другого, что невозможно включить в этот пост. Меня волнуют только выбросы. Этот фрагмент кода показывает, что сам метод измерения дает выбросы, поэтому его необходимо улучшить. Мой вариант использования чувствителен к выбросам, и я хочу получить представление о наихудшем сценарии.
Я пытаюсь запустить тест с приоритетом в реальном времени, но у меня возникли проблемы с установкой это вверх. Запуск его как пользовательского процесса с максимальным приоритетом на выделенном ядре не удаляет выбросы.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -benchmark
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»