日志与sqrt的计算成本的公平检验

时间:2018-06-26 17:22:09

标签: r performance complexity-theory arithmetic-expressions

假设对分析目的既可以使用对数变换又可以对平方根变换数据进行记录,那么这是一种更好的方法来评估对数变换还是平方根变换数据呢?特别是,我试图了解在R中是否重要,如果我选择应用logsqrt来转换数据,以及是否依赖于数据的性质,总体尺寸等

这是我最初使用的代码:

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(docs?),更普遍的是(2)这个问题?

例如,我想知道我上面尝试过的一些失败是否是

  • 使用整数(对于浮点数,答案可能有所不同)
  • 使用单调密集序列吗?

我最普遍的问题是进行评估的重要性,我需要关于R或我的硬件的什么知识才能以一种聪明的方式提出这个问题?

谢谢!

1 个答案:

答案 0 :(得分:4)

使用基准测试包。 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