2013-06-20 45 views
0

我正在设计一个算法,并试图了解每个步骤需要多少时间才能完成R处理以及总流程需要多长时间。要获取时间信息,我使用proc.time()命令。似乎所有迭代的每个步骤的时间与总时间不匹配。让我举一个例子为了更好地说明:R中的处理时间

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和100次迭代的T2,我们看到,这个时间小于T0或数学,

(t1 + t2) for 100 steps < t0 

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

+0

他们有什么不同? – doctorlove

+0

所以,我运行这个迭代28000次,差不多有10步,并且对于每次迭代,时间量都会变化,并且在我进行的运行中,为28000次迭代添加了t1,t2,t3 ... t10小时,其中t0为13小时。所以,差不多6小时,我想说的是巨大的 – Pawan

+0

正如利维乌斯所说,如果你只加起来t1的最后一个值,t2并且有很大的变化,那很可能是错误的 – doctorlove

回答

3

有更好的方法来在R中获得性能指标:system.time()。 (参见http://stat.ethz.ch/R-manual/R-patched/library/base/html/system.time.html

在您的例子,你的t0是测量的总时间为100次迭代,但t1t2正在每次迭代计算,所以在端部,它们只反映的时间值的最后迭代。

+0

我会尝试使用system.time()。不,它不会是最后一次迭代的值,因为我为所有迭代存储了t1和t2的值,并且在最后,我将t1和t2的值添加到所有迭代中以获得最终时间。 – Pawan

+2

@Pawan't0'也会有其他的东西:垃圾回收,如果你正在用一个并行软件包做一些事情,那么调度开销会很大,等等。存储所有单独的'tn'值在内存方面也是浪费的,可能导致更多的垃圾收集或额外的分配,这可以以各种方式增加运行时间,特别是在没有大量RAM的系统上。获得平均性能的更有效方法是每次只添加它们:'tn_running < - tn_running + tn_thisloop'然后最后除以迭代次数。 – Livius

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 iterationt0和obvisouly两者是不相等的。现在当我比较时,sum(t1 + t2 + t01)t0发现两者相等。所以,我们可以说这个区别是因为删除了对象和垃圾收集。 但现在我有不同的问题,为什么rm()gc()需要这么多时间?