Я хотел бы измерить время, необходимое для повторного запуска функции.
replicate()
Эквивалентны ли циклы for и используются ли они ? Например:system.time(replicate(1000, f())); system.time(for(i in 1:1000){f()});
Какой предпочтительный метод.
В выводе
system.time()
, являетсяsys+user
фактическое время процессора для запуска программы? Являетсяelapsed
ли хорошим показателем времени выполнения программы?
36
Ответы:
Для эффективной синхронизации программ, особенно когда вы заинтересованы в сравнении альтернативных решений, вам нужен контроль! Хороший способ состоит в том, чтобы поместить процедуру, которую вы синхронизируете, в функцию. Вызовите функцию в цикле синхронизации. Напишите процедуру-заглушку, по сути, удалив весь код из вашей функции и просто вернувшись из нее (но оставьте все аргументы внутри) Поместите заглушку в петлю времени и повторите время. Это измеряет все накладные расходы, связанные с синхронизацией. Вычтите время окурка из времени процедуры, чтобы получить чистую: это должно быть точной мерой фактического необходимого времени.
Поскольку в настоящее время большинство систем могут быть прерваны без прерывания, важно выполнить несколько прогонов синхронизации, чтобы проверить их изменчивость. Вместо того, чтобы делать один длинный прогон из секунд, делайте прогонов примерно по секунд каждый. Это помогает сделать это в двойной петле все за один раз. Это не только легче в обращении, но и вносит небольшую отрицательную корреляцию в каждый временной ряд, что фактически улучшает оценки.N m N/m
Используя эти базовые принципы экспериментального проектирования, вы по существу контролируете любые различия, связанные с тем, как вы развертываете код (например, различие между циклом for и replicate ()). Это делает вашу проблему уйти.
источник
Относительно ваших двух пунктов:
replicate()
как это функционально.elapsed
, т.е. на третьем номере.Что я часто делаю
чтобы получить усеченное среднее из 90% N повторений вызова
f()
.(Отредактировано, спасибо Хэдли за то, что он поймал мысли.)
источник
mean(replicate(N, system.time(f(...))[3]), trim = 0.05)
?Вы можете также время с временными шагами, возвращенными
Sys.time
; это, конечно, измеряет настенное время, поэтому время вычислений в реальном времени. Пример кода:источник
Относительно того, какой показатель времени использовать, я не могу добавить к другим респондентам.
Что касается используемой функции, мне нравится использовать? Benchmark из пакета rbenchmark .
источник
Они делают разные вещи. Время, что вы хотите сделать. replicate () возвращает вектор результатов каждого выполнения функции. Цикл для не делает. Следовательно, они не являются эквивалентными утверждениями.
Кроме того, время ряд способов вы хотите что-то сделать. Тогда вы сможете найти наиболее эффективный метод.
источник