Приемлемо ли тестирование по секундомеру?

StackOverflow https://stackoverflow.com/questions/410437

  •  03-07-2019
  •  | 
  •  

Вопрос

Использовал ли кто-нибудь когда-нибудь бенчмаркинг по секундомеру или всегда следует использовать инструмент повышения производительности?Существуют ли хорошие бесплатные инструменты для Java?Какие инструменты вы используете?

Чтобы прояснить мои опасения, бенчмаркинг секундомера может вызывать ошибки из-за планирования операционной системы.При каждом запуске вашей программы ОС может запланировать другой процесс (или несколько) в середине функции, которую вы синхронизируете.В Java дела обстоят даже немного хуже, если вы пытаетесь синхронизировать многопоточное приложение, поскольку планировщик JVM добавляет в смесь еще немного больше случайности.

Как вы учитываете планирование операционной системы при тестировании?

Это было полезно?

Решение

Тестирование по секундомеру подходит, если вы измеряете достаточно итерации, чтобы иметь смысл.Обычно мне требуется общее прошедшее время, равное некоторому количеству однозначных секунд.В противном случае ваши результаты могут быть существенно искажены из-за планирования и других прерываний операционной системы вашего процесса.

Для этого я использую небольшой набор статических методов, которые я создал давным-давно и которые основаны на System.currentTimeMillis().

Для профилирования я использовал jProfiler уже несколько лет и считаю, что это очень хорошо.Я недавно просмотрел ВашКит, что на веб-сайте кажется отличным, но лично я им вообще не пользовался.

Чтобы ответить на вопрос о планировании прерываний, я считаю, что повторение прогонов до тех пор, пока не будет достигнута/наблюдена согласованность, на практике помогает отсеять аномальные результаты планирования процесса.Я также обнаружил, что планирование потоков не имеет практического эффекта при выполнении от 5 до 30 секунд.Наконец, после того, как вы преодолеете порог в несколько секунд, планирование, по моему опыту, оказывает незначительное влияние на результаты - я обнаружил, что 5-секундный прогон постоянно дает в среднем то же самое, что и 5-минутный прогон по времени/итерации.

Вы также можете рассмотреть возможность предварительного запуска тестируемого кода примерно 10 000 раз, чтобы «разогреть» JIT, в зависимости от того, сколько раз, по вашему мнению, тестируемый код будет выполняться с течением времени в реальной жизни.

Другие советы

Это абсолютно справедливо, если вы измеряете достаточно большие интервалы времени.Я бы выполнил 20–30 запусков того, что вы собираетесь протестировать, чтобы общее затраченное время превышало 1 секунду.Я заметил, что расчеты времени, основанные на System.currentTimeMillis(), обычно составляют либо 0 мс, либо ~ 30 мс;Я не думаю, что вы сможете получить что-то более точное, чем это.Возможно, вы захотите попробовать System.nanoTime(), если вам действительно нужно измерить небольшой интервал времени:

Профилировщик предоставляет более подробную информацию, которая может помочь диагностировать и устранять проблемы с производительностью.

С точки зрения фактического измерения, время секундомера — это то, что замечают пользователи, поэтому, если вы хотите убедиться, что все находится в допустимых пределах, время секундомера подойдет.

Однако, если вы действительно хотите устранить проблемы, профилировщик может оказаться очень полезным.

Секундомер на самом деле является лучшим ориентиром!

Реальное время ответа конечного пользователя — это время, которое действительно имеет значение.

Не всегда возможно получить это время, используя доступные инструменты, например, большинство инструментов тестирования не включают время, необходимое браузеру для отображения страницы, поэтому слишком сложная страница с плохо написанным CSS будет показывать время отклика менее секунды на тестирование. инструменты, но 5 секунд плюс время ответа пользователю.

Эти инструменты отлично подходят для автоматического тестирования и выявления проблем, но не упускайте из виду то, что вы действительно хотите измерить.

Вам необходимо протестировать реалистичное количество итераций, поскольку вы получите разные ответы в зависимости от того, как вы проверяете время.Если вы выполняете операцию только один раз, принятие среднего значения за множество итераций может ввести в заблуждение.Если вы хотите узнать, сколько времени пройдет после прогрева JVM, вы можете запустить множество (например,10 000) итераций, которые не включены в тайминги.

Я также предлагаю вам использовать System.nanoTime() так как это гораздо точнее.Если время вашего теста составляет около 10 микросекунд или меньше, не следует вызывать его слишком часто, иначе это может изменить ваш результат.(например.Если я тестирую, скажем, 5 секунд и хочу знать, когда это произойдет, я получаю nanoTime только каждые 1000 итераций, если я знаю, что итерация очень быстрая)

Как вы учитываете планирование операционной системы при тестировании?

Ориентир для довольно долго в системе, которая соответствует машине, которую вы будете использовать.Если ваша ОС замедляет работу вашего приложения, это должно быть частью результата.

Нет смысла говорить, моя программа была бы быстрее, если бы у меня не было ОС.

Если вы используете Linux, вы можете использовать такие инструменты, как numactl, chrt и taskset для контроля использования процессоров и планирования.

Профилировщики могут мешать измерению времени, поэтому я бы использовал комбинацию секундомера для выявления общих проблем с производительностью, а затем использовал профилировщик, чтобы определить, на что тратится время.Повторите процесс по мере необходимости.

В конце концов, это, вероятно, вторая по популярности форма бенчмаркинга, сразу после «бенчмаркинга без наблюдения», когда мы говорим: «это действие кажется медленным, то — быстрым».

Обычно наиболее важным для оптимизации является то, что мешает работе пользователя, что чаще всего зависит от того, как часто вы выполняете действие, и от того, что еще происходит в это же время.Другие формы сравнительного анализа часто просто помогают сосредоточиться на этих вопросах.

Думаю, ключевым вопросом является сложность и длительность операции.

Иногда я даже использую физические измерения с помощью секундомера, чтобы увидеть, занимает ли какое-либо вычисление минуты, часы, дни или даже недели (я работаю с приложением, где время выполнения порядка нескольких дней не является чем-то неслыханным, даже если секунды и минуты наиболее распространенные промежутки времени).

Однако автоматизация, обеспечиваемая вызовами любой системы часов на компьютере, например вызовом java millis, упомянутым в связанной статье, явно превосходит ручное наблюдение за тем, как долго что-то работает.

Профилировщики хороши, когда они работают, но у меня были проблемы с их применением в нашем приложении, которое обычно включает в себя динамическую генерацию кода, динамическую загрузку DLL и работу, выполняемую на двух встроенных, моментально скомпилируемых скриптовых языках: мое заявление.Они довольно часто ограничиваются предположением об одном исходном языке и другими нереалистичными ожиданиями от сложного программного обеспечения.

Сегодня я запустил программу, которая искала и собирала информацию из множества файлов dBase, это заняло чуть больше час бежать.Я взглянул на код, сделал обоснованное предположение о том, в чем заключается узкое место, внес небольшое улучшение в алгоритм и повторно запустил программу, на этот раз она завершилась за 2,5 минуты.

Мне не нужны были какие-либо необычные инструменты профилирования или наборы тестов, чтобы сказать, что новая версия значительно улучшилась.Если бы мне нужно было еще больше оптимизировать время работы, я, вероятно, провел бы более сложный анализ, но в этом не было необходимости.Я считаю, что такого рода «сравнительный анализ по секундомеру» является приемлемым решением во многих случаях, и обращение к более продвинутым инструментам в этих случаях фактически отнимает больше времени.

Я не думаю, что тестирование по секундомеру — это слишком уж ужасно, но если вы можете получить доступ к машине с Solaris или OS X, вам следует попробовать DTrace.Я использовал его, чтобы получить полезную информацию о времени в своих приложениях.

Я всегда использую бенчмаркинг по секундомеру, так как это намного проще.Однако для меня результаты не обязательно должны быть очень точными.Если вам нужны точные результаты, вам не следует использовать бенчмаркинг с секундомером.

Я делаю это все время.Я бы предпочел использовать профилировщик, но поставщик предметно-ориентированного языка, с которым я работаю, его не предоставляет.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top