循环内耗时总和与函数总耗时不符:缺失时间去向何方?
循环内耗时总和与函数总耗时差异的原因分析
你遇到的这种差异主要来自以下几个未被内层计时覆盖的开销:
1. 向量动态扩容的额外开销
代码中timetot = c()初始化了一个空向量,每次循环执行timetot[i] = ...时,R需要为向量重新分配更大的内存空间,并复制已有数据到新空间。这部分内存操作的耗时不会被内层system.time(randommat %*% randomvec)统计(因为它只计算矩阵乘法的时间),但会被外层统计函数总耗时的system.time完全计入,这是两者差距的核心原因。
2. system.time自身的调用开销
每次调用system.time()都存在自身的执行成本:包括启动计时逻辑、读取系统时间、整理返回结果等。这部分开销在100次循环中会累计叠加,被外层的总耗时统计,但不会被内层的计时捕获(内层只统计括号内表达式的耗时)。
3. 后台系统与R运行时的开销
函数运行过程中,R的垃圾回收(GC)、系统进程调度、内存管理等后台操作也会占用时间。这些操作通常在循环的间隙发生,不会被内层的system.time记录,但会被外层的总耗时包含在内。
验证与优化示例
如果提前为向量分配固定长度,消除动态扩容的开销,总耗时会显著接近循环内耗时总和:
RunSimu <- function(){ timetot = numeric(100) # 提前分配好100长度的向量 for (i in 1:100){ timetot[i] = system.time(randommat %*% randomvec)[3] } return(timetot) }
内容的提问来源于stack exchange,提问作者Taotao Tan
相关产品推荐
相关产品推荐

