Как сделать хороший бенчмаркинг сложных функций? - PullRequest
3 голосов
/ 26 декабря 2010

Я собираюсь приступить к очень подробному бенчмаркингу набора сложных функций в C. Это детали "научного уровня".Мне интересно, что было бы лучшим способом сделать серьезный бенчмаркинг?Я думал о том, чтобы запустить их, скажем, по 10 раз каждый, усреднить результаты синхронизации и дать стандартное значение, например, просто используя <time.h>.Что бы вы, ребята, сделали, чтобы получить хорошие результаты?

Ответы [ 2 ]

7 голосов
/ 26 декабря 2010

Отчет о среднем и стандартном отклонении дает хорошее описание распределения, когда рассматриваемое распределение приблизительно нормальное.Однако это редко относится к измерениям производительности вычислений.Вместо этого измерения производительности имеют тенденцию более близко напоминать распределение Пуассона.Это имеет смысл, потому что не так много случайных событий на компьютере заставит программу работать быстрее;по существу, весь шум измерения заключается в том, сколько случайных событий происходит, что приводит к его замедлению.(Напротив, нормальное распределение не дает никакого интуитивного смысла вообще ; для этого потребуется уверенность в том, что программа имеет ненулевую вероятность завершения в отрицательное время).

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

"10 разкаждый "звучит как очень несколько итераций для меня.Я обычно делаю что-то порядка тысяч (или более, в зависимости от функции / системы) прогонов, если это не полностью невозможно.Как минимум, вам нужно убедиться, что вы запускаете синхронизацию достаточно долго, чтобы исключить любую зависимость от состояния системы, некоторые из которых могут измениться при довольно большой временной детализации.

Еще одна вещь, которую вы должныСледует помнить, что, по сути, в каждой системе имеется доступный для конкретной платформы таймер, который намного точнее, чем тот, который доступен <time.h>.Узнайте, что это такое на вашей целевой платформе [ы] и используйте вместо этого.

0 голосов
/ 28 декабря 2010

Я предполагаю, что вы смотрите на бенчмаркинг чисто алгоритмических вычислений в вашей программе, и нет никакого пользовательского ввода или вывода, который может занять непредсказуемое время. Теперь для программ, которые просто сокращают число, ваши результаты могут отличаться в зависимости от времени фактического запуска вашей программы, что будет зависеть от других текущих действий в системе. Может быть и другой фактор, который вы можете игнорировать, в зависимости от желаемого уровня точности, т.е. воздействия из-за отсутствия кэша, разного времени доступа через иерархию памяти ». Одним из методов является, как вы предложили, расчет среднего за несколько прогонов. Или вы можете попытаться взглянуть на код сборки и увидеть сгенерированные инструкции. А затем на основе процессора получить количество циклов для этих инструкций. Этот метод может оказаться непрактичным в зависимости от объема кода, который вы хотите проверить. Если вы особенно относитесь к влиянию иерархии памяти, то вам может потребоваться очень тщательно контролировать среду выполнения, т. Е. Где загружается программа, где загружаются ее данные и т. Д. Но, как я уже говорил, в зависимости от желаемой точности, вы можете поглотить изменение, вызванное памятью. иерархия в вас статистическая вариация ". Возможно, вам придется тщательно спроектировать входные данные теста для ваших функций, чтобы обеспечить охват пути, и вы можете опубликовать статистику производительности как функцию входных данных теста. Это покажет, как функция ведет себя в диапазоне входных данных

...