Допустим ли бенчмаркинг секундомера?
Кто-нибудь когда-либо использовал бенчмаркинг с секундомером или всегда использовался инструмент производительности? Есть ли хорошие Java инструменты для Java? Какие инструменты вы используете?
Чтобы прояснить мои проблемы, бенчмаркинг секундомера подвержен ошибкам из-за планирования операционной системы. При заданном запуске вашей программы ОС может планировать другой процесс (или несколько) в середине функции, которую вы синхронизируете. В Java ситуация даже немного хуже, если вы пытаетесь запустить многопоточное приложение, поскольку планировщик JVM выбрасывает еще немного случайности в микс.
Как вы оцениваете планирование операционной системы при бенчмаркинге?
Ответы
Ответ 1
Сравнительный анализ секундомера в порядке, если вы измеряете достаточное количество итераций, чтобы иметь смысл. Как правило, мне требуется общее время, прошедшее через некоторое количество секунд с цифрой. В противном случае ваши результаты могут быть значительно искажены путем планирования и других прерываний O/S для вашего процесса.
Для этого я использую небольшой набор статических методов, которые я построил давно, которые основаны на System.currentTimeMillis()
.
Для работы профилирования я использовал jProfiler в течение нескольких лет и нашел это очень хорошим. Недавно я просмотрел YourKit, который кажется отличным от WebSite, но лично я его не использовал лично.
Чтобы ответить на вопрос о прерываниях планирования, я обнаружил, что выполнение повторных прогонов до тех пор, пока не достигнуто/соблюдено согласование, на практике не удается отсеять аномальные результаты планирования процесса. Я также обнаружил, что планирование потоков не имеет практического воздействия для прогонов от 5 до 30 секунд. Наконец, после того, как вы пройдете несколько секунд, планирование по расписанию имеет, по моему опыту, незначительное влияние на результаты - я нахожу, что 5-секундный запуск последовательно усредняет то же самое, что и 5-минутный запуск для времени/итерации.
Вы также можете подумать о том, чтобы превзойти тестируемый код примерно в 10 000 раз, чтобы "разогреть" JIT, в зависимости от того, сколько раз вы ожидаете, что тестируемый код будет работать со временем в реальной жизни.
Ответ 2
Это полностью действует до тех пор, пока вы измеряете достаточно большие интервалы времени. Я выполнил бы 20-30 прогонов того, что вы намерены протестировать, чтобы общее прошедшее время составляло более 1 секунды. Я заметил, что расчеты времени, основанные на System.currentTimeMillis(), как правило, равны 0 мс или ~ 30 мс; Я не думаю, что вы можете получить что-то более точное, чем это. Вы можете попробовать System.nanoTime(), если вам действительно нужно измерить небольшой интервал времени:
Ответ 3
Профилировщик дает вам более подробную информацию, которая может помочь в диагностике и устранении проблем с перфорацией.
С точки зрения фактического измерения время секундомера - это то, что пользователи отмечают, поэтому, если вы хотите проверить, что все находится в допустимых пределах, время секундомера прекрасное.
Если вы хотите действительно исправить проблемы, тем не менее, профилировщик может быть действительно полезен.
Ответ 4
Вам нужно проверить реалистичное количество итераций, так как вы получите разные ответы в зависимости от того, как вы проверяете время. Если вы выполняете операцию только один раз, это может ввести в заблуждение, чтобы принять среднее число многих итераций. Если вы хотите узнать время, которое потребуется после прогрева JVM, вы можете запустить много (например, 10000) итераций, которые не включены в тайминги.
Я также предлагаю использовать System.nanoTime() как более точно. Если время тестирования составляет около 10 микросекунд или меньше, вы не хотите слишком часто его вызывать или можете изменить свой результат. (например, если я тестирую 5 секунд, и я хочу знать, когда это произойдет, я получаю nanoTime каждые 1000 итераций, если я знаю, что итерация очень быстрая)
Ответ 5
Секундомер на самом деле является лучшим эталоном!
Реальное время отклика от конечного пользователя - это время, которое действительно имеет значение.
Не всегда возможно получить это время с помощью доступных инструментов, например, большинство инструментов тестирования не включают время, которое требуется для того, чтобы браузер отображал страницу, поэтому перекомплексированная страница с плохо написанным css отображает время второго ответа к инструментам тестирования, но, 5 секунд плюс время отклика для пользователя.
Инструменты отлично подходят для автоматического тестирования и для решения проблемы, но не теряют из виду то, что вы действительно хотите измерить.
Ответ 6
Профилировщики могут мешать таймингам, поэтому я бы использовал комбинацию времени секундомера для определения общих проблем с производительностью, а затем использовал профилировщик для определения времени, в которое расходуется время. Повторите по мере необходимости.
Ответ 7
Сегодня я запускал программу, которая просматривала и собирала информацию из кучи файлов dBase, для запуска потребовалось чуть больше часа. Я взглянул на код, сделал обоснованное предположение о том, что было узким местом, сделал небольшое усовершенствование алгоритма и повторил программу, на этот раз он завершился за 2,5 минуты. Мне не нужны какие-либо фантастические инструменты для профилирования или контрольные комплекты, чтобы сказать мне, что новая версия значительно улучшилась. Если бы мне нужно было еще больше оптимизировать время работы, я, вероятно, сделал бы еще более сложный анализ, но это было необязательно. Я нахожу, что такой "тест-стоп-секундомер" является приемлемым решением в довольно многих случаях, и прибегать к более продвинутым инструментам будет в этом случае более трудоемким.
Ответ 8
В конце концов, это, вероятно, вторая по популярности форма бенчмаркинга, сразу после "безрезультатного тестирования" - где мы говорим "это действие кажется медленным, что кажется быстрым".
Обычно наиболее важным для оптимизации является то, что мешает работе пользователя, что чаще всего зависит от того, как часто вы выполняете действие и что еще происходит в одно и то же время. Другие формы бенчмаркинга часто просто помогают в этом.
Ответ 9
Я думаю, что ключевым вопросом является сложность и продолжительность операции.
Я иногда даже использую физические измерения секундомера, чтобы узнать, требуется ли для вычисления сколько-нибудь минут, часов, дней или даже недель (я работаю с приложением, где время выполнения по порядку несколько дней не слышно, даже если секунды и минуты являются наиболее распространенными временными интервалами).
Однако автоматизация, предоставляемая вызовами любой системы часов на компьютере, например, вызов java millis, упомянутый в связанной статье, явно превосходит ручную проверку того, как долго что-то работает.
Профилиры хороши, когда они работают, но у меня были проблемы с их применением в нашем приложении, которое обычно включает в себя динамическое генерирование кода, динамическую загрузку библиотек DLL и работу, выполняемую в двух встроенных компиляциях "точно в срок" языки сценариев моего приложения. Они довольно часто ограничиваются допущением одного исходного языка и других нереалистичных ожиданий для сложного программного обеспечения.
Ответ 10
Как вы оцениваете планирование операционной системы при бенчмаркинге?
Сравнительный тест достаточно долго для системы, которая является репрезентативной для машины, которую вы будете использовать. Если ваша ОС замедляет ваше приложение, это должно быть частью результата.
Нет смысла говорить, что моя программа была бы быстрее, если бы у меня не было ОС.
Если вы используете Linux
, вы можете использовать такие инструменты, как numactl
, chrt
и taskset
, чтобы управлять использованием процессоров и планированием.
Ответ 11
Я всегда использую бенчмаркинг секундомера, так как это намного проще. Результаты, однако, не должны быть очень точными для меня. Если вам нужны точные результаты, вам не следует использовать бенчмаркинг секундомера.
Ответ 12
Я не думаю, что тест-секундомер слишком ужасен, но если вы можете попасть на компьютер Solaris или OS X, вы должны проверить DTrace. Я использовал его, чтобы получить отличную информацию о сроках в моих приложениях.
Ответ 13
Я делаю это все время. Я бы предпочел использовать профилировщик, но поставщик домена, на котором я работаю, не предоставляет его.