【问题标题】:Process Time in RR中的处理时间
【发布时间】:2013-06-20 11:54:40
【问题描述】:

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

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

【问题讨论】:

  • 它们有何不同?
  • 所以,我正在运行这个迭代 28000 次,其中有近 10 个步骤,每次迭代的时间量都不同,在我所做的运行中,t1、t2、t3 .. . 28000 次迭代的 t10 增加了 7 小时,而 t0 为 13 小时。所以,几乎额外的 6 个小时,我会说这是巨大的
  • 正如 Livius 所说,如果你只是将 t1、t2 的最后一个值相加并且有很大的变化,那很可能是错误的
  • 我建议将您的算法拆分并在step1step2 上独立运行microbenchmark

标签: r time proc


【解决方案1】:

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

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

【讨论】:

  • 我会尝试使用 system.time()。不,它不会是最后一次迭代的值,因为我存储了所有迭代的 t1 和 t2 的值,最后,我将所有迭代的 t1 和 t2 的值相加以获得最终时间。
  • @Pawan t0 还会包含其他内容:垃圾收集、调度开销(如果您正在使用其中一个并行包)等。存储所有单独的 tn 值在内存方面也很浪费,可能会导致更多的垃圾收集或额外的分配,这可能会以各种方式增加您的运行时间,尤其是在没有大量 RAM 的系统上。获得平均性能的更有效方法是每次都添加它们:tn_running &lt;- tn_running + tn_thisloop,然后最后除以迭代次数。
【解决方案2】:

最后,我得到了总时间与所有步骤的所有迭代总和的差异的答案。不同之处在于我使用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 ,显然两者并不相等。现在当我比较sum(t1 + t2 + t01)t0 时,发现两者是相等的。因此,我们可以说差异是因为删除了对象和垃圾收集。 但是现在我有不同的问题,为什么rm()gc() 需要这么多时间?

【讨论】:

    猜你喜欢
    • 2010-12-30
    • 2017-01-01
    • 2013-06-12
    • 1970-01-01
    • 2021-02-18
    • 1970-01-01
    • 2010-11-26
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多