Контрольный показатель - это то, что измеряет время для целой операции. например Операции ввода-вывода в секунду при некоторой рабочей нагрузке. Таким образом, результат, как правило, представляет собой одиночное число в секундах или в секундах или в секундах. Или набор данных с результатами для разных параметров, чтобы вы могли его нарисовать.
Вы можете использовать эталон для сравнения одного и того же программного обеспечения на другом оборудовании или в разных версиях некоторых других программ, с которыми взаимодействует ваш бенчмарк. например сравнивает максимальное количество подключений в секунду с различными настройками apache.
Профилирование не предназначено для сравнения разных вещей: это понимание поведения программы. Результатом профиля может быть таблица времени, затраченная на каждую функцию, или even per instruction with a sampling profiler. Вы можете сказать, что это профиль, не являющийся эталоном, потому что нет смысла говорить, что «эта функция заняла наименьшее время, поэтому мы сохраним ее и перестанем использовать остальные».
Прочитайте статью Википедии, чтобы узнать больше об этом: https://en.wikipedia.org/wiki/Profiling_(computer_programming)
Вы используете профиль, чтобы выяснить, где нужно оптимизировать. Ускорение на 10% в функции, в которой ваша программа тратит 99% своего времени, более ценна, чем 100% -ное ускорение в любой другой функции. Еще лучше, когда вы можете улучшить свой дизайн на высоком уровне, поэтому дорогостоящая функция называется меньше, а также просто делает ее быстрее.
Microbenchmarking является специфической формой сравнительного анализа. Это означает, что вы тестируете одну супер-специфическую вещь, чтобы измерить только то, что в изоляции, не общая производительность всего, что действительно полезно.
Результаты Пример microbenchmark:
- Intel Haswell's L1 cache load-use latency is 4 cycles.
- Эта версия memcpy достигает 80% пропускной способности другой версии.
mov eax, ecx
has 0c latency on Haswell, but mov ecx, ecx
has 1c latency. (mov-exception работает только между разными регистрами на Intel). См. Эту ссылку для полного источника asm статического исполняемого файла, а результат счетчика производительности - от запуска его с помощью нескольких разных тел цикла, чтобы продемонстрировать отмену mov.
Использование счетчиков производительности процессора для измерения того, как работает микро-тест, является хорошим способом проведения экспериментов, чтобы узнать, как работают ЦП внутри. См. Также How exactly do partial registers on Haswell/Skylake perform? Writing AL seems to have a false dependency on RAX, and AH is inconsistent. В этом случае вы профилируете свой микро-бенчмарк, чтобы узнать, что заставляет его работать с такой скоростью. (Часто вас больше интересуют счетчики perf, такие как uops_executed, чем вы находитесь в фактическом времени или такте цикла тактирования, например, чтобы протестировать микро-fusion/un-lamination, не требуя создания цикла, где это фактически влияет на циклы на итерацию.)
Примера немикрокапсулированных результаты тесты:
- сжатие этой коллекции 100MB файлов заняло 23 секунд с 7-Zip (с определенными параметрами и аппаратным обеспечением).
- компиляция ядра Linux заняла 99 секунд на некоторой аппаратной/программной комбинации.
См. Также https://en.wikipedia.org/wiki/Benchmark_(computing)#Types_of_benchmarks.
Микро-бенчмаркинг - это особый случай бенчмаркинга. Если вы все сделаете правильно, в нем рассказывается, какие операции дороги и дешевы, что помогает вам при оптимизации. Если вы сделаете это неправильно, вы, вероятно, даже не измерили то, что вы намеревались измерить вообще. например вы написали несколько C для тестирования циклов и циклов, но компилятор сделал разные коды по разным причинам, и ваши результаты не имеют смысла. (Различные способы выразить ту же логику почти никогда не имеют значения с современными оптимизирующими компиляторами, не тратьте время на это.) Микро-бенчмаркинг трудный.
Другой способ сказать, что это микро-бенчмарк, заключается в том, что вам обычно нужно посмотреть на выход ASM компилятора, чтобы убедиться, что он тестирует то, что вы хотите проверить. (например, что он не оптимизировал итерации цикла повторения-10 М-времени, подняв что-то дорогое из цикла, которое должно было повторить всю операцию достаточное количество раз, чтобы дать длительность, которая может быть точно измерена.)
Micro -benchmarking может исказить вещи, потому что они проверяют вашу функцию с помощью кэширования горячих и отраслевых предсказателей, и они не запускают никакого другого кода между вызовами тестируемого кода. Это может привести к огромному просмотру циклов, когда в рамках реальной программы это приведет к большему количеству промахов в кеше. Точно так же большие таблицы поиска выглядят хорошо, потому что вся таблица поиска попадает в кеш. В полной программе обычно достаточно кэширования между вызовами функции, которые таблица поиска не всегда попадает в кеш, поэтому было бы дешевле просто вычислить что-то. (Большинство программ связаны с памятью. Повторное вычисление чего-то не слишком сложного часто бывает так же быстро, как и его поиск).
Спасибо, что нашли время. Но моя путаница начинается с микро-бенчмаркинга - это означало бы, что я просто _benchmark_ только определенную функцию моей программы? И в чем же отличие от _profile_ определенной функции? –
@JimMcAdams: Да, это именно то, что касается микрообъектива: все повторяется одна и та же работа. В результате профиля, сверление до одной функции, мы надеемся, покажу вам% от общего времени в строке за строкой. (Или инструкция по инструкции, так как в этой гранулярности это имеет большее значение, чем выглядит ASM, чем источник.) Или вы можете пропустить пропуски кэша записи вместо циклов синхронизации. –
Хороший ответ, (я пытаюсь научиться объяснять вещи достаточно ясно), вы практиковали учение? :). – 0xc0de