以R表示的处理时间

以R表示的处理时间,r,time,proc,R,Time,Proc,我正在设计一个算法,并试图看看每一步在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

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

t0对于性能指标,有一种更好的方法在R中计时:
system.time()
。(见附件)


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

在R中有一种更好的方法来计算性能指标的时间:
system.time()
。(见附件)


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

最后,我得到了总时间与所有步骤的所有迭代总和之差的答案。区别在于,我使用
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

t0最后,我得到了总时间与所有步骤的所有迭代总和的差异的答案。区别在于,我使用
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

t0它们有多大不同?因此,我运行了28000次这个迭代,其中包含了近10个步骤,每次迭代的时间量都不同,在我进行的运行中,t1、t2、t3。。。28000次迭代的t10增加了7小时,其中t0为13小时。所以,几乎多了6个小时,我想说的是hugeAs Livius说,如果你只是把t1,t2的最后值加起来,并且有很大的变化,这很可能是错误的。我建议把你的算法拆开,在
step1
step2
上独立运行
microbenchmark
。它们有什么不同呢,我正在运行这个迭代28000次,其中包含了近10个步骤,每次迭代的时间都会有所不同,在我进行的运行中,t1、t2、t3。。。28000次迭代的t10增加了7小时,其中t0为13小时。所以,几乎多了6个小时,我想说的是hugeAs Livius说,如果你只是把t1,t2的最后一个值加起来,并且有很大的变化,这可能是错误的。我建议把你的算法拆开,在
step1
step2
上独立运行
microbenchmark
。我会尝试使用system.time()。不,它不会是上一次迭代的值,因为我正在为所有迭代存储t1和t2的值,最后,我将为所有迭代添加t1和t2的值,以获得最终时间。@Pawan
t0
还将包含其他内容:垃圾收集,调度开销如果您正在使用其中一个并行包等执行某些操作。存储所有单个
tn
值在内存方面也是浪费的,可能会导致更多的垃圾收集或额外的分配,这可能会以各种方式增加您的运行时间,尤其是在没有大量RAM的系统上。获得平均性能的更有效方法是每次添加它们:
tn\u running我将尝试使用system.time()。不,它不会是上一次迭代的值,因为我正在为所有迭代存储t1和t2的值,最后,我将为所有迭代添加t1和t2的值,以获得最终时间。@Pawan
t0
还将包含其他内容:垃圾收集,调度开销如果您正在使用其中一个并行包等执行某些操作。存储所有单个
tn
值在内存方面也是浪费的,可能会导致更多的垃圾收集或额外的分配,这可能会以各种方式增加您的运行时间,尤其是在没有大量RAM的系统上。获得平均性能的更有效方法是每次添加它们:
tn\u running