# 将函数、文件、包编译成字节码文件可以大大提高运行速度,这是系统性能优化的重要方法之一
# 实验发现使用compiler包编译函数非常简单、方便,性能提升效果立竿见影
# compiler包似乎是随系统一起安装的核心包,并且函数数量不多,容易掌握
# compiler包是系统核心包之一,并不需要专门下载安装
## 01、compiler #####################################################################################
library(compiler)
#cmpfun()函数:
# 测试函数
# 分10次每次生成100万个正态分布的随机数
TstFun <- function(){
for( i in 1:10){
x1 <- (rnorm(1000000,100,30))
i <- i + 1
}
}
# 使用cmpfun()函数编译TstFun()函数为字节码函数
# 同时将字节码函数加载到内存中以便调用
CTstFun <- cmpfun(TstFun)
# 普通方式调用函数
system.time(TstFun())
# 调用字节码函数
# 运行时间有明显减少
system.time(CTstFun())
f <- function(x) print(x)
cf <- cmpfun(f)
cf(2)
#disassemble()函数:
# disassemble()函数将加载到内存中的字节码函数卸载掉
# 卸载掉函数
disassemble(CTstFun)
# 卸载之后还是可以使用
system.time(CTstFun())
## 02、compiler #####################################################################################
# 生成1000万的正态分布随机数并赋值的表达式
tmp1 <- rnorm(1e7,100,30)
# 把表达式编译为字节码
ce <- compile(rnorm(1e7,100,30));ce # 输出的是字节码对象
# 再次编译之后得到的字节码对象不同
ce <- compile(rnorm(1e7,100,30));ce
system.time(tmp1 <- rnorm(1e7,100,30))
# 编译整个R脚本为字节码文件
# 用普通文本编辑器打开cx文件发现并不是一般的文本文件
# 输出文件一般使用扩展名.Rc以便和一般R语言文件扩展名区分
cmpfile("x.R","x.Rc")
#x.R是输入文件,内容如下:
i <- 1
sum <- 0
print("前两行代码已经运行!")
print("开始进入循环")
while(i <= 100){
sum <- sum + i
i <- i + 1
}
print(sum)
# 装载经过编译的x.Rc文件成功(此处loadcmp("x.R")则会出错)
# 加载字节码文件后立即执行
# 这个加载过程和sys.source()类似
# 但同上述函数不同的是:默认将代码文件加载到全局环境而非基础环境中
loadcmp("x.Rc")
# 启用或禁用:JIT,just-in-time编译器
# 参数设置为0,则不使用JIT编译器
# 参数设置为1,函数在第一次使用前就编译
# 参数设置为2,函数第2次调用前编译;这对一些扩展包很有用比如lattice,它在列表中存储函数
# 参数设置为3,所有循环在调用前都被编译
# JIT参数也可以在启动R时通过环境变量R_ENABLE_JIT做设置
enableJIT(0)
enableJIT(1)
enableJIT(3)
# 当扩展包安装时,启用/禁用编译扩展包
# 也可以在R启动时,通过设置环境变量R_ENABLE_PKGS
compilePKGS(T)
compilePKGS(F)
####来源地址:http://blog.163.com/george_xuehui/blog/static/1158863572014511114134399/
#向量化实现也是很重要的优化方法
向量化函数:ifelse(),which(),where(),any(),all(),cumsum(),cumprod(),pmax()
对矩阵而言:rowSums(),colSums()
# 实验发现使用compiler包编译函数非常简单、方便,性能提升效果立竿见影
# compiler包似乎是随系统一起安装的核心包,并且函数数量不多,容易掌握
# compiler包是系统核心包之一,并不需要专门下载安装
## 01、compiler #####################################################################################
library(compiler)
#cmpfun()函数:
# 测试函数
# 分10次每次生成100万个正态分布的随机数
TstFun <- function(){
for( i in 1:10){
x1 <- (rnorm(1000000,100,30))
i <- i + 1
}
}
# 使用cmpfun()函数编译TstFun()函数为字节码函数
# 同时将字节码函数加载到内存中以便调用
CTstFun <- cmpfun(TstFun)
# 普通方式调用函数
system.time(TstFun())
# 调用字节码函数
# 运行时间有明显减少
system.time(CTstFun())
f <- function(x) print(x)
cf <- cmpfun(f)
cf(2)
#disassemble()函数:
# disassemble()函数将加载到内存中的字节码函数卸载掉
# 卸载掉函数
disassemble(CTstFun)
# 卸载之后还是可以使用
system.time(CTstFun())
## 02、compiler #####################################################################################
# 生成1000万的正态分布随机数并赋值的表达式
tmp1 <- rnorm(1e7,100,30)
# 把表达式编译为字节码
ce <- compile(rnorm(1e7,100,30));ce # 输出的是字节码对象
# 再次编译之后得到的字节码对象不同
ce <- compile(rnorm(1e7,100,30));ce
system.time(tmp1 <- rnorm(1e7,100,30))
# 编译整个R脚本为字节码文件
# 用普通文本编辑器打开cx文件发现并不是一般的文本文件
# 输出文件一般使用扩展名.Rc以便和一般R语言文件扩展名区分
cmpfile("x.R","x.Rc")
#x.R是输入文件,内容如下:
i <- 1
sum <- 0
print("前两行代码已经运行!")
print("开始进入循环")
while(i <= 100){
sum <- sum + i
i <- i + 1
}
print(sum)
# 装载经过编译的x.Rc文件成功(此处loadcmp("x.R")则会出错)
# 加载字节码文件后立即执行
# 这个加载过程和sys.source()类似
# 但同上述函数不同的是:默认将代码文件加载到全局环境而非基础环境中
loadcmp("x.Rc")
# 启用或禁用:JIT,just-in-time编译器
# 参数设置为0,则不使用JIT编译器
# 参数设置为1,函数在第一次使用前就编译
# 参数设置为2,函数第2次调用前编译;这对一些扩展包很有用比如lattice,它在列表中存储函数
# 参数设置为3,所有循环在调用前都被编译
# JIT参数也可以在启动R时通过环境变量R_ENABLE_JIT做设置
enableJIT(0)
enableJIT(1)
enableJIT(3)
# 当扩展包安装时,启用/禁用编译扩展包
# 也可以在R启动时,通过设置环境变量R_ENABLE_PKGS
compilePKGS(T)
compilePKGS(F)
####来源地址:http://blog.163.com/george_xuehui/blog/static/1158863572014511114134399/
#向量化实现也是很重要的优化方法
向量化函数:ifelse(),which(),where(),any(),all(),cumsum(),cumprod(),pmax()
对矩阵而言:rowSums(),colSums()
穷举:combn(),outer,lower.tri(),upper.tri(),expand.grid()