Я запускаю этот код на 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);
}
Он производит:
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. Это заполнитель для чего-то другого, что невозможно включить в этот пост. Меня волнуют только выбросы. Этот фрагмент кода показывает, что сам метод измерения дает выбросы, поэтому его необходимо улучшить. Мой вариант использования чувствителен к выбросам, и я хочу получить представление о наихудшем сценарии.
Я пытаюсь запустить тест с приоритетом в реальном времени, но у меня возникли проблемы с установкой это вверх. Запуск его как пользовательского процесса с максимальным приоритетом на выделенном ядре не удаляет выбросы.
Чтобы изолировать от активности ОС, я установил ядро Ubuntu реального времени с pro Enable Realtime-Kernel и добавлен GRUB_CMDLINE_LINUX="nohz=on nohz_full=15 rcu_nocbs=15 isolcpus=15 irqaffinity=0-14" в grub. Я также вызываю sched_setaffinity() для ядра №15. Я запускаю итерации 1G и вижу гораздо меньшие выбросы:
1,000,000,000 iterations, PID 13232, NICE -20
min: 0.012us med: 0.020us 99%: 0.023us max: 13.731us 499999999500000000
7.636
9.137
9.760
12.583
13.145
13.240
13.585
13.682
13.731
Подробнее здесь: https://stackoverflow.com/questions/791 ... -benchmark
Каков источник выбросов в этом тесте C++? ⇐ C++
Программы на C++. Форум разработчиков
1729930434
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. Это заполнитель для чего-то другого, что невозможно включить в этот пост. Меня волнуют только выбросы. Этот фрагмент кода показывает, что сам метод измерения дает выбросы, поэтому его необходимо улучшить. Мой вариант использования чувствителен к выбросам, и я хочу получить представление о наихудшем сценарии.
Я пытаюсь запустить тест с приоритетом в реальном времени, но у меня возникли проблемы с установкой это вверх. Запуск его как пользовательского процесса с максимальным приоритетом на выделенном ядре не удаляет выбросы.
Чтобы изолировать от активности ОС, я установил ядро Ubuntu реального времени с pro Enable Realtime-Kernel и добавлен GRUB_CMDLINE_LINUX="nohz=on nohz_full=15 rcu_nocbs=15 isolcpus=15 irqaffinity=0-14" в grub. Я также вызываю sched_setaffinity() для ядра №15. Я запускаю итерации 1G и вижу гораздо меньшие выбросы:
1,000,000,000 iterations, PID 13232, NICE -20
min: 0.012us med: 0.020us 99%: 0.023us max: 13.731us 499999999500000000
7.636
9.137
9.760
12.583
13.145
13.240
13.585
13.682
13.731
Подробнее здесь: [url]https://stackoverflow.com/questions/79124227/what-is-the-source-of-outliers-in-this-c-benchmark[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия