March 2026

S M T W T F S
12 34567
891011121314
151617 18192021
22232425262728
293031    

Style Credit

Expand Cut Tags

No cut tags
Monday, August 20th, 2007 01:04 pm

Допустим, у меня есть процедура, вычисляющая некую функцию f(x). Есть модификация, который позволяет эту процедуру ускорить, и надо проверить, насколько именно. Процедура довольно быстрая - скажем, порядка десятков миллисекунд (все цифры условные для примера). Т.е. чтобы ее мерять достаточно уверенно, надо написать бенчмарк, который ее запускает, скажем, 1000 раз и меряет, сколько времени заняло. Тут начинается интересное - бенчмарк дает разброс между, скажем, 10.8 секунды и 10.1 секунды. Какое значение использовать? Можно посчитать среднее, но с другой стороны - если некоторые бенчмарки выполняются за 10.1 секунды, не значит ли это, что именно настолько быстрая эта функция и есть, а значения выше этого - это мусор, вызванный каким-то другими эффектами в системе?
Имеет ли смысл удлинять тест, тестировать не 1000, а 10000, скажем? С одной стороны, относительный разброс становится меньше, с другой - больше вероятности, что во время теста случится что-нибудь, что повлияет на результаты (к сожалению, в современной ОС без значительных усилий трудно знать, не решит ли какой-нибудь процесс прямо сейчас что-нибудь поделать)?
Теперь дальше - меряем улучшеную функцию, получаем разброс, скажем, от 8.9 до 8.2. Можно ли утверждать, что мы ускорили функцию с 10.1 до 8.2 - т.е. практически на 20% - или же надо опять считать средние и сравнивать их?
Я знаю, что обычно принято считать среднее, но не очень понятно, почему именно в этом случае это будет лучше (для ясности - мне надо знать не насколько быстрая сама функция, а насколько конкретная модификация ее ускоряет).
Monday, August 20th, 2007 10:06 pm (UTC)
ну дык конечно среднее. потому что зачем нам знать абсолютное идеальное время выполнения, если оно недостижимо, или достижимо редко? интересно знать, сколько времени реально понадобится для прогона.
Tuesday, August 21st, 2007 04:50 am (UTC)
для того, чтобы улучшать что-нибудь, надо бы сначала понять, что именно мы улучшаем. по мне, так среднее время пробега (потому что минимальное, как и было сказано, недостижимо).
Monday, August 20th, 2007 10:06 pm (UTC)
Я думаю, что проще всего сделать Т-тест (а можно наверно и Z) и сказать что с такой-то долей уверенности (по таблицам T-распределения) функция 2 лучше чем функция 1. Мне кажется, что численное выражение тут будет шаманством - слишком это зависит от работы ОС в это время. Ещё, возможно, я бы сравнивал не не обе выборки целиком а по два центральных квадраната выкинув марджины. Это сильно снизит шум.
Monday, August 20th, 2007 10:47 pm (UTC)
Когда меряешь экспериментально и хочешь численного выражения, надо кучу всего делать для минимазации шума. Напрашивается:
1) Абсолютно пустой компъютер, облегченная до минимума операционная система
2) Рестарт после каждого сэмпла
3) Отрубить сеть
4) Отрубить все завязанные на scheduller таски.

И всё равно - фигово обычно получается:( В гугл-сколаре масса статей о том, как ставить подобные эксперименты, очень нетривиальная задача, ИМХО, если нужен корректный результат.
Monday, August 20th, 2007 11:02 pm (UTC)
:)
Ещё советуют после каждого рестарта выжидать минут по 10-15 чтоб все обязательные сервисы успели подняться. А ещё, в случае сетевого исполнение, надо следить чтоб траффик не прыгал сильно. У нас в лабе рассказывают байку как один длинный ночной эксперимент начал выдавать поразительно интересные результаты:
В воскресенье все работало офигенно, потом, замедлялось до пятницы, а субботу просто нафиг висло. И повторялось с воскресенья. Выяснилось - ночной сетевой бэкап:)
Tuesday, August 21st, 2007 01:09 am (UTC)
:) это актуальная рекомендация для платформы ZX-80?
Tuesday, August 21st, 2007 05:34 am (UTC)
Вероятнее всего - нет:) Но, подозреваю с ZX-80 вообще меньше проблем в плане шума:)))
Tuesday, August 21st, 2007 03:38 pm (UTC)
init 2
остаётся необходимый сетевой доступ, отрубается NFS и прочие потенциально неприятные вещи.
Monday, August 20th, 2007 10:48 pm (UTC)
да, а по 25 процентов результатов с обеих сторон - все равно лучше всего выкинуть и считать среднее для двух центральных квадранатов каждого сэмпла.
Monday, August 20th, 2007 10:59 pm (UTC)
Потому, что поймав очень хороший минимум в одной серии, нельзя быть уверенным что в другой серии его не случилось потому что другой алгоритм хуже. Возможно, что во время запуска другой серии условия ОС были просто хуже... Поэтому, считают среднее в надежде на то, что этим средним будет примерно одинаковая загрузка системы.
Monday, August 20th, 2007 10:07 pm (UTC)
А почму просто профайлером не воспользоваться? он тебе все построчно распишет... или среда не та?
Monday, August 20th, 2007 11:56 pm (UTC)
Конечно, речь не идет о единичном исполнении: имеется в виду, что в профайлере твоя функция запускается не один раз. Большое достоинство профайлера - возможность сравнить в процентном отношении к пробегу программы, сколько времени было потрачено именно в твоей функции и в каких именно строчках. Если не предполагать, что загрузка системы скачет, как сумашедшая, то это более ценный показатель, чем просто обшее время пробега, которое зависит от общей загрузки системы в данный момент. Хотя, конечно, абсолютной панацеи в реальных условиях, пожалуй, нет.
Tuesday, August 21st, 2007 05:58 am (UTC)
Пиши честно - ускорилось на 15-20%. Какой смысл в высокой точности, если налицо широкое распределение?
Tuesday, August 21st, 2007 08:23 am (UTC)
если процедура без i/o, то можно брать CPU time конкретного процесса, будет точнее.
Tuesday, August 21st, 2007 09:03 am (UTC)
ИМХО, профайлер по идее точнее меряет
Tuesday, August 21st, 2007 10:23 am (UTC)
///если некоторые бенчмарки выполняются за 10.1 секунды, не значит ли это, что именно настолько быстрая эта функция и есть, а значения выше этого - это мусор, вызванный каким-то другими эффектами в системе///

Так и есть. Запускаешь раз 10 - 20, берешь наименьший результат и всё.

///Теперь дальше - меряем улучшеную функцию, получаем разброс, скажем, от 8.9 до 8.2. Можно ли утверждать, что мы ускорили функцию с 10.1 до 8.2 - т.е. практически на 20% ///

Да, можно. Также прогоняешь тесть раз 10 - 20, берешь минимальный результат - это есть время работы функции. Всё остальное - мусор.