Как получить повторяемые циклические тесты в Windows? - PullRequest
0 голосов
/ 09 марта 2009

Иногда нам приходится запускать некоторые тесты с привязкой к процессору, где мы хотим измерить время выполнения. Тесты длятся порядка минуты. Проблема в том, что время выполнения может сильно варьироваться (+/- 5%). Мы подозреваем, что изменение вызвано активностью других приложений / служб в системе, например:

  • Приложения, выполняющие ведение домашнего хозяйства во время простоя (например, Visual Studio, обновляющий IntelliSense)
  • Индексаторы файловой системы
  • и т.д ..

Какие советы помогут повысить стабильность наших тестов?

В настоящее время мы минимизируем все остальные приложения, запускаем тесты с приоритетом «выше нормального» и не касаемся машины во время выполнения теста.

Ответы [ 4 ]

1 голос
/ 17 мая 2009

Цитата из блога команды VC ++, как они делают тесты производительности :

Чтобы уменьшить шум на тестовых машинах, мы предпринимаем несколько шагов:

  1. Остановите как можно больше служб и процессов.
  2. Отключить сетевой драйвер: это отключит прерывания от NIC, вызванные> широковещательными пакетами.
  3. Настройка соответствия процессора тесту для запуска только на одном процессоре / ядре.
  4. Установите запуск на высокий приоритет, что уменьшит количество переключений контекста.
  5. Запустить тест на несколько итераций.
1 голос
/ 09 марта 2009

Прежде всего, если речь идет о бенчмаркинге самого приложения, вам следует использовать время ЦП, а не время настенных часов в качестве меры. Это тогда (почти) свободно от влияний того, что делают другие процессы или система. Во-вторых, как указал Дикон Рид , большее количество повторений повышает уверенность.

1 голос
/ 09 марта 2009

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

0 голосов
/ 09 марта 2009

Я делаю следующее:

  1. Вызовите метод x раз и измерьте время
    • Сделайте это n раз и рассчитайте среднее и стандартное отклонение этих измерений

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

Среднее значение скажет вам среднюю производительность вашего теста и стандартное отклонение стабильности вашего теста / измерений.

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

Этот код демонстрирует, как это сделать в .NET:

Thread.CurrentThread.Priority = ThreadPriority.Highest;
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.RealTime;
if (Environment.ProcessorCount > 1)
{
   Process.GetCurrentProcess().ProcessorAffinity = 
      new IntPtr(1 << (Environment.ProcessorCount - 1));
}
...