На мой взгляд, существует два вида тестов, когда речь заходит о тестировании программного обеспечения. Во-первых, микробенчмарки, когда вы пытаетесь оценить фрагмент кода изолированно или как система справляется с узко определенной рабочей нагрузкой. Сравните два алгоритма сортировки, написанных на Java. Сравните два веб-браузера, насколько быстро каждый из них может выполнять некоторые операции с DOM. Во-вторых, существуют системные тесты (я только что назвал их), когда вы пытаетесь оценить программную систему в условиях реалистичной рабочей нагрузки. Сравните мой бэкэнд на Python, работающий на Google Compute Engine и на Amazon AWS.
При работе с Java и т.п., имейте в виду, что виртуальная машина должна прогреться, прежде чем она сможет дать вам реалистичную производительность. Если вы измеряете время с помощью команды time
, время запуска JVM будет включено. Вы почти всегда хотите либо игнорировать время запуска, либо отслеживать его отдельно.
Microbenchmarking
Во время первого запуска кэши ЦП заполняются необходимыми данными. То же самое касается дисковых кешей. В течение нескольких последующих запусков виртуальная машина продолжает прогреваться, что означает, что JIT компилирует то, что считает полезным для компиляции. Вы хотите игнорировать эти прогоны и начать измерения после этого.
Сделайте много измерений и вычислите статистику. Среднее значение, медиана, стандартное отклонение, график. Посмотрите на это и посмотрите, насколько это меняется. Вещи, которые могут повлиять на результат, включают в себя паузы ГХ в ВМ, масштабирование частоты на ЦП, некоторые другие процессы могут запускать некоторые фоновые задачи (например, сканирование на вирусы), ОС может решить переместить процесс на другое ядро ЦП, если вы имеют архитектуру NUMA , результаты будут еще более заметными.
В случае микробенчмарков все это является проблемой. Убейте, какие процессы вы можете, прежде чем начать. Используйте тестовую библиотеку, которая может сделать что-то для вас. Как https://github.com/google/caliper и тому подобное.
Системный бенчмаркинг
В случае сравнительного анализа системы при реалистичной рабочей нагрузке эти данные вас не очень интересуют, и ваша задача «только» узнать, что такое реалистичная рабочая нагрузка, как ее сгенерировать и какие данные собирать. Всегда лучше, если вы сможете использовать производственную систему и собирать там данные. Обычно это можно сделать, потому что вы измеряете характеристики конечного пользователя (как долго отображалась веб-страница), и они привязаны к вводу / выводу, чтобы сбор данных не замедлял работу системы. (Страница должна быть отправлена пользователю по сети, не имеет значения, если мы также запишем несколько номеров в процессе).
Помните о разнице между профилированием и сравнительным анализом. Сравнительный анализ может дать вам абсолютное время, потраченное на выполнение чего-либо, профилирование дает вам относительное время, потраченное на выполнение чего-либо по сравнению со всем остальным, что нужно было сделать. Это связано с тем, что профилировщики запускают насыщенные инструментарием программы (обычная техника - останавливать мир каждые несколько сотен мс и сохранять трассировку стека), а инструментарий значительно замедляет работу.