如何在R中正确传递...可变参数解决microbenchmark测试结果异常问题
问题原因
microbenchmark的核心逻辑是对传入的未求值表达式做重复运行计时,你直接透传...的写法会触发R的求值缓存:第一次调用microbenchmark(..., times=1)运行完三个函数后,传入的f1(100)等表达式的结果已经被缓存,第二次调用microbenchmark时实际测试的是读取缓存值的速度,并非函数真实运行耗时,所以得到的时间会远低于预期。
解决方案
你只需要在自定义函数入口先捕获所有未求值的测试表达式,之后每次调用microbenchmark都传入该表达式列表即可,修改后的代码如下:
fComp = function(..., times, maxdif){ # 捕获所有传入的测试表达式,不提前求值 test_exprs <- substitute(...()) # 首次预测试 mb = microbenchmark(list = test_exprs, times = 1) if(max(abs(mb$time - dplyr::lead(mb$time)), na.rm = TRUE) < maxdif) { # 正式测试复用未求值的表达式列表,确保每次都真实运行测试函数 mb = microbenchmark(list = test_exprs, times = times) } mb }
验证说明
调用mb = fComp(f1(100), f2(100), f3(100), times=10, maxdif = 1e6)后查看mb$time,得到的结果会和你最初未封装时的运行结果一致。
内容的提问来源于stack exchange,提问作者blrun
相关产品推荐
相关产品推荐

