Время обработки в R

Я разрабатываю алгоритм и пытаюсь понять, сколько времени занимает каждый шаг в R и сколько времени занимает весь процесс. Чтобы получить информацию о времени, я использую команду proc.time(). Кажется, что время каждого шага для всей итерации не совпадает с общим временем. Позвольте мне привести пример для лучшей иллюстрации:

t0 <- proc.time()
for (i in 1 :100){
     t1<- proc.time()
     step 1 
     t1 <- proc.time() - t1

     t2<- proc.time()
     step 2 
     t2 <- proc.time() - t2
 }
 t0 <- proc.time() - t0

Итак, теперь, если я добавлю все t1 и t2 из 100 итераций, мы увидим, что это время меньше, чем t0 или математически,

(t1 + t2) for 100 steps < t0

В чем причина вышеуказанного поведения? и как мы можем избавиться от этого поведения, поскольку это сильно влияет на время выполнения алгоритма.


person Pawan    schedule 20.06.2013    source источник
comment
Насколько они разные?   -  person doctorlove    schedule 20.06.2013
comment
Итак, я запускаю эту итерацию 28000 раз, в ней почти 10 шагов, и для каждой итерации количество времени варьируется, и в прогоне, который я сделал, t1, t2, t3 ... t10 для 28000 итераций добавлено 7 часов где t0 равнялось 13 часам. Итак, почти лишние 6 часов, что я бы сказал, огромно   -  person Pawan    schedule 20.06.2013
comment
Как говорит Ливиус, если вы просто сложите последние значения t1, t2 и получите большие вариации, это, вероятно, будет неправильным.   -  person doctorlove    schedule 20.06.2013
comment
Я бы рекомендовал разобрать ваш алгоритм и запустить microbenchmark на step1 и step2 независимо друг от друга.   -  person Carl Witthoft    schedule 20.06.2013


Ответы (2)


Есть лучший способ измерения времени в R для показателей производительности: system.time(). (См. http://stat.ethz.ch/R-manual/R-patched/library/base/html/system.time.html)

В вашем примере ваш t0 измеряет общее время для 100 итераций, но t1 и t2 рассчитываются для каждой итерации, поэтому в конце они отражают только значение времени для последней итерации.

person Livius    schedule 20.06.2013
comment
Я попробую использовать system.time(). Нет, это не будет значение последней итерации, потому что я сохраняю значения t1 и t2 для всех итераций и в конце добавляю значения t1 и t2 для всех итераций, чтобы получить окончательное время. - person Pawan; 20.06.2013
comment
В @Pawan t0 также будут другие вещи: сборка мусора, планирование накладных расходов, если вы что-то делаете с одним из параллельных пакетов и т. д. Хранение всех отдельных значений tn также расточительно с точки зрения памяти, что может привести к большему сборка мусора или дополнительные выделения памяти, которые могут увеличить время выполнения всеми возможными способами, особенно в системе с небольшим объемом оперативной памяти. Более эффективный способ получить среднюю производительность — просто добавлять их каждый раз: tn_running <- tn_running + tn_thisloop, а затем в конце просто делить на количество итераций. - person Livius; 20.06.2013

Наконец, я получил ответ для разницы в общем времени по сравнению с суммой для всех итераций всех шагов. Разница заключалась в том, что я использовал rm() для удаления переменной и других данных, которые не будут использоваться в последующих шагах, а после удаления этих объектов я использовал gc() для освобождения памяти. И я никогда не измерял время для rm() и gc() шагов, думая, что они не займут много времени, но я ошибался, эти два оператора в итоге заняли почти столько же времени, сколько требовалось для каждой итерации. Когда я удалил эти два, общее время выполнения совпало с суммой всех итераций всех шагов. С точки зрения кода это можно объяснить как

t0 <- proc.time()
for (i in 1 :100){
     t1<- proc.time()
     step 1 
     t1 <- proc.time() - t1
     t01 <- proc.time()
     rm(obj1, obj2 )
     gc()
     t01 <- proc.time() - t01 
     t2<- proc.time()
     step 2 
     t2 <- proc.time() - t2
 }
 t0 <- proc.time() - t0

Итак, ранее я сравнивал sum(t1 + t2) for all iteration с t0 и очевидно, что они не были равны. Теперь, когда я сравнил sum(t1 + t2 + t01) с t0 и обнаружил, что они равны. Итак, мы можем сказать, что разница была из-за удаления объекта и сборки мусора. Но теперь у меня другой вопрос, почему rm() и gc() занимают так много времени?

person Pawan    schedule 22.06.2013