【发布时间】:2011-10-03 02:34:54
【问题描述】:
我正在尝试计算 logab(并得到一个浮点数,而不是整数)。我打算以log(b)/log(a) 的身份执行此操作。从数学上讲,我可以使用任何cmath 对数函数(以 2、e 或 10 为底)进行此计算;但是,我会在我的程序中经常运行这个计算,所以我想知道其中一个是否比其他的快得多(或者更好的是,如果有更快但仍然简单的方法来做到这一点)。如果重要的话,a 和 b 都是整数。
【问题讨论】:
-
用 Donald Knuth 的话来说:“我们应该忘记小的效率,比如说大约 97% 的时间:过早的优化是万恶之源”
-
@You “无意识的咒语是富有成效的思想的诅咒”
-
@You - 我一直觉得报价被过度使用了。当然,在某些情况下,您可能会花费大量精力,降低代码的可读性,最终却没有注意到差异。还有很多其他情况,您可以花费很少的精力,完全不影响可读性,并做出巨大的改进。除非您完全停止考虑潜在客户,否则要知道哪个案例是哪个案例。
-
@You:乘法、加法和减法都比 log、exp 和 trig 快 很多。 Sqrt和divide介于两者之间。 (英特尔 Skylake 有一个 非常 快速的 FP 除法单元,但它仍然是 a factor of 8 worse throughput, and a factor of ~3 worse latency than FP mul。sqrt 只是稍微慢一点)。检查几何平均值为
(x^2+y^2) < maxdistance^2而不是sqrt(x^2+y^2) < maxdistance要快得多,尤其是。如果您重复执行此检查(例如在 Mandelbrot 内循环中),或者使用整数。 (x86 标量整数除法比 SIMD FP 除法慢。) -
@You 那是部分且确实是选择性的引用。我建议您阅读其余部分,尤其是最后一句。全文如下: '程序员浪费大量时间去思考或担心他们程序中非关键部分的速度,而在考虑调试和维护时,这些效率上的尝试实际上会产生强烈的负面影响.我们应该忘记小的效率,比如大约 97% 的时间:过早优化是万恶之源。然而,我们不应该放弃那关键的 3% 的机会。'
标签: c++ c logarithm math.h cmath