어제 The Art of R Programming 책을 보다가 2.13에서 포함된 바이트 컴파일러 패키지 예제를 보고 몇 가지 코드를 올려본다.
크게 3가지 코드가 있는데, 테스트는 10000000의 데이터를 가진 벡터끼리의 곱 연산 속도 비교를 for문 기반, 바이트 컴파일 된 함수 기반,vectorization 기반 이렇게 세가지 방법으로 돌려봤다.
결과는 바이트 컴파일 된 함수가 for으로 돌린 컴파일되지 않은 코드보다 3배 이상 빨랐고, 벡터화 된 코드는 컴파일 된 for문 코드보다 212배 빨랐다.
2.13.2에 새로 포함된 바이트 컴파일러 패키지 사용이 코드 속도 향상에 도움이 되긴 하지만 역시나 vectorization 기반의 코드 작성이 훨씬 많은 성능향상을 가져온다는 것을 알 수 있다.
for문을 쓰지 않고 얻을 수 있는 최적화의 정도가 너무 크니 앞으로 for문 사용을 최대한 자제하는 게 나을 듯 하다.
library(compiler)
x <- rnorm(10000000)
y <- rnorm(10000000)
z <- vector(mode="numeric",length=10000000)
system.time(z <- x * y)
test1 <- function(){
for(i in 1:10000000)
z[i] <<- x[i] * y[i]
}
system.time(test1())
# user system elapsed
# 39.551 0.094 39.651
comp_test1 <- cmpfun(test1)
system.time(comp_test1())
# user system elapsed
# 11.831 0.066 11.898
system.time(z <- x * y)
# user system elapsed
# 0.034 0.022 0.056