Справедливый тест вычислительной стоимости log против sqrt - PullRequest
0 голосов
/ 26 июня 2018

Какой справедливый способ оценить, лучше ли регистрировать данные преобразования или преобразования квадратного корня, если предположить, что для аналитических целей я тоже могу их использовать? В частности, Я пытаюсь понять, имеет ли значение в R значение, если я решу применить log или sqrt для преобразования данных, и если да, то зависит ли это от характера данных, их общего размера и т. Д. .

Вот код, который я изначально использовал:

start.time = Sys.time()
for (x in 1:10000)
  log(x)
end.time = Sys.time()
print(end.time - start.time)

start.time = Sys.time()
for (x in 1:10000)
  sqrt(x)
end.time = Sys.time()
print(end.time - start.time)

Однако затем я начал задаваться вопросом, зависит ли это от характера данных, поэтому я попробовал варианты, такие как увеличение или уменьшение плотности значений:

start.time = Sys.time()
for (x in 1:10000000)
  log(x^8)
end.time = Sys.time()
print(end.time - start.time)

start.time = Sys.time()
for (x in 1:10000000)
  sqrt(x^8)
end.time = Sys.time()
print(end.time - start.time)

В тех случаях, когда я пытался, sqrt всегда был немного быстрее, чем log, но у меня нет опыта в тестировании эффективности / сложности, и я удивляюсь , если есть «правильный» способ ответить на этот вопрос (1 ) для R в частности (документы?) и (2) в более общем смысле?

Например, мне интересно, являются ли некоторые недостатки того, что я пробовал выше:

  • Использование целых чисел (может отличаться для чисел с плавающей запятой)
  • Используя монотонную плотную последовательность?

Мой самый общий вопрос: что важно для проведения оценки, и что мне нужно знать о R или моем оборудовании, чтобы разумно задать этот вопрос?

Спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Используйте пакет для сравнения. R имеет несколько из них. Я рекомендую microbenchmark. Прочитайте его документацию для некоторых идей по бенчмаркингу.

Тренировка. Не принимайте оптимизацию слишком серьезно. Всегда учитывайте интеллектуальные издержки, связанные с необходимостью думать об этом.

Например:

library(microbenchmark)
x <- (1:1e6)^8
y <- runif(1e6)
z <- sort(y)
microbenchmark(log(x), sqrt(x), log(y), sqrt(y), log(z), sqrt(z), times=10)
#> Unit: milliseconds
#>     expr       min       lq     mean   median       uq      max neval cld
#>   log(x) 45.778425 46.21116 46.46333 46.40788 46.90995 46.99119    10  b 
#>  sqrt(x)  9.576967 11.30364 11.97100 11.99424 12.39120 16.09995    10 a  
#>   log(y) 58.630950 60.16966 60.68071 60.67257 61.53909 62.02924    10   c
#>  sqrt(y)  9.557819 11.09652 15.95161 11.97811 12.42969 55.37263    10 a  
#>   log(z) 46.039493 46.17527 46.34378 46.33622 46.43773 46.81620    10  b 
#>  sqrt(z) 11.111878 11.15454 11.77100 11.61037 12.35596 12.43116    10 a
...