При попытке оптимизировать мой код я обнаружил, что некоторые операции logical
были медленнее, чем я ожидал, по сравнению с аналогичными операциями на integer
или numeric
.
Итак, я переписывал базовые булевы операторы !
, &
, |
, xor
следующим образом:
my.not <- function(x) as.logical(1L - as.integer(x))
my.and <- function(e1, e2) as.logical(as.integer(e1) * as.integer(e2))
my.or <- function(e1, e2) as.logical(as.integer(e1) + as.integer(e2))
my.xor <- function(e1, e2) as.logical(as.integer(e1) + as.integer(e2) == 1L)
Тестирование того, что все работает так, как ожидалось:
a <- sample(c(TRUE, FALSE), 1e6, TRUE)
b <- sample(c(TRUE, FALSE), 1e6, TRUE)
identical(!a, my.not(a)) # TRUE
identical(a & b, my.and(a, b)) # TRUE
identical(a | b, my.or(a, b)) # TRUE
identical(xor(a, b), my.xor(a, b)) # TRUE
Теперь сравнительный анализ:
library(microbenchmark)
microbenchmark(!a, my.not(a),
a & b, my.and(a, b),
a | b, my.or(a, b),
xor(a, b), my.xor(a, b))
# Unit: milliseconds
# expr min lq median uq max neval
# !a 1.237437 1.459042 1.463259 1.492671 17.28209 100
# my.not(a) 6.018455 6.263176 6.414515 15.291194 70.16313 100
# a & b 32.318530 32.667525 32.769014 32.973878 50.55528 100
# my.and(a, b) 8.010022 8.592776 8.750786 18.145590 78.38736 100
# a | b 32.030545 32.383769 32.506937 32.820720 102.43609 100
# my.or(a, b) 12.089538 12.434793 12.663695 22.046841 32.19095 100
# xor(a, b) 94.892791 95.480200 96.072202 106.104000 164.19937 100
# my.xor(a, b) 13.337110 13.708025 14.048350 24.485478 29.75883 100
Глядя на результаты, оператор !
является единственным, который, похоже, делает приличную работу по сравнению с моей. Остальные три в несколько раз медленнее. Немного неловко для функций Primitive
. Я даже ожидаю, что хорошо реализованные логические операторы должны быть намного быстрее, чем операции с целыми числами (как я реализовал свои собственные функции.)
Вопрос: Почему? Плохая реализация? Или, может быть, примитивные функции делают некоторые хорошие вещи (например, проверку ошибок, особые случаи), что мои функции не являются?