Common Subexpression Elimination

f <- function(n) {
  a <- 1
  b <- 1
  c <- 1
  d <- 1
  for (i in seq_len(n)) {
    e <- (a * b)^3 + c # common subexpression (a * b)^3
    f <- (a * b)^3 * d # common subexpression (a * b)^3
  }
}

f_opt <- function(n) {
  a <- 1
  b <- 1
  c <- 1
  d <- 1
  for (i in seq_len(n)) {
    tmp <- (a * b)^3 # common subexpression elimination
    a <- tmp + c
    d <- tmp * d
  }
}

f_c <- cmpfun(f)
f_opt_c <- cmpfun(f_opt)
n <- 10000
autoplot(microbenchmark(f(n), f_c(n), f_opt(n), f_opt_c(n)))