Jump Threading

f <- function(n) {
  evens <- 0
  evens2 <- 0
  odds <- 0
  for (i in seq_len(n)) {
    if (i %% 2 == 0) { # same logical as next if condition (can be merged)
      evens <- evens + 1
    }
    if (i %% 2 == 0) {
      evens2 <- evens2 + 1 # same as previous if condition (can be merged)
    }
    if (!(i %% 2 == 0)) { # exact negation as previous if (can be an else)
      odds <- odds + 1
    }
  }
}

f_opt <- function(n) {
  evens <- 0
  evens2 <- 0
  odds <- 0
  for (i in seq_len(n)) {
    if (i %% 2 == 0) { # merged
      evens <- evens + 1
      evens2 <- evens2 + 1
    } else { # converted to else
      odds <- odds + 1
    }
  }
}

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)))