0

我正在设计一种算法,并试图查看 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

所以,现在如果我添加 100 次迭代的所有 t1 和 t2,我们看到这个时间小于 t0 或数学上,

(t1 + t2) for 100 steps < t0

上述行为的原因是什么?以及我们如何摆脱这种行为,因为这会极大地影响算法的运行时间。

4

2 回答 2

3

在 R 中,有一种更好的方法来衡量性能指标:system.time(). (见http://stat.ethz.ch/R-manual/R-patched/library/base/html/system.time.html

在您的示例中,您t0正在测量 100 次迭代的总时间,但是每次迭代都在计算t1t2,所以最后,它们只反映最后一次迭代的时间值。

于 2013-06-20T12:00:47.127 回答
0

最后,我得到了总时间与所有步骤的所有迭代总和的差异的答案。不同之处在于我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()这么多时间?

于 2013-06-22T14:29:11.807 回答