R中的字节编译器优化

时间:2015-04-19 21:08:08

标签: r performance optimization compilation compiler-optimization

考虑R

中的以下代码
####### CODE 1 #######

test = FALSE # or TRUE
for (i in 1:10^5){
   if (test){
      DoThat(i)
   } else {
      DoThis(i)
   }
}

如果R编译器是好的,我希望在每次迭代时都不会评估if语句的条件。 Code 1将等同于

####### CODE 2 #######

test = FALSE # or TRUE
if (test){
  for (i in 1:10^5){
      DoThat(i)
  }
} else {
  for (i in 1:10^5){
      DoThis(i)
  }
}

Code 1更容易阅读,但如果编写得不好,则会比code 2

编译后两个代码是否等效(就计算时间而言)?我应该确保将我的代码包含在一个函数中(最终是一个名为main的函数),以确保编译得到很好的优化吗?

仅供参考:我的R版本为R 3.1.2 GUI 1.65 Mavericks build (6833)

1 个答案:

答案 0 :(得分:4)

这似乎是你可以轻松自我测试的东西(而且我会在混合中投入另一个选项

DoThis<-function(x) x+2
DoThat<-function(x) x+1

f1<-function() {
    test = FALSE # or TRUE
    for (i in 1:10^5){
        if (test){
            DoThat(i)
        } else {
            DoThis(i)
        }
    }
}

f2<-function() {
    test = FALSE # or TRUE
    if (test){
        for (i in 1:10^5){
            DoThat(i)
        }
    } else {
        for (i in 1:10^5){
            DoThis(i)
        }
    }   
}

f3<-function() {
    test = FALSE # or TRUE
    if (test){
        fn<-DoThat
    } else {
        fn<-DoThis
    }
    for (i in 1:10^5){
        fn(i)
    }
}

然后与

进行比较
library(microbenchmark)
microbenchmark(f1(),f2(),f3())

# Unit: milliseconds
#  expr      min       lq     mean   median       uq      max neval cld
#  f1() 55.44489 57.79875 61.50379 60.65098 62.25607 118.8442   100   b
#  f2() 42.70537 44.30422 52.45846 46.37495 48.51268 499.1535   100  ab
#  f3() 41.59938 42.92486 47.29460 46.02898 47.50596 117.2711   100  a 

正如您所看到的,它们在微秒级别上的运行时间大致相当。

如果你要&#34;编译&#34;他们通过compiler::cmpfun,结果不会发生太大变化

f1c = compiler::cmpfun(f1)
f2c = compiler::cmpfun(f2)
f3c = compiler::cmpfun(f3)
microbenchmark(f1c(),f2c(),f3c())

# Unit: milliseconds
#   expr      min       lq     mean   median       uq       max neval cld
#  f1c() 42.39095 45.59775 50.22462 47.38297 49.73408 132.88284   100   b
#  f2c() 41.79704 43.79836 46.87072 44.98536 48.21903 126.02609   100  a 
#  f3c() 40.07256 42.33789 45.14435 44.16019 46.32952  66.53634   100  a 

测试时间:R版本3.1.0(2014-04-10),平台:x86_64-apple-darwin10.8.0(64位)