题
有人知道乘法运算符是否比使用 Math.Pow 方法更快吗?喜欢:
n * n * n
与
Math.Pow ( n, 3 )
解决方案
基本上,你应该的基准可查看。
受过教育的臆测(不可靠):
如果它不被一些编译器优化,以同样的事情... 的
这很可能是x * x * x
是Math.Pow(x, 3)
必须对付它一般情况下,问题,处理分数的权力等问题比Math.Pow
快,而x * x * x
将只需要几个乘法指令,那么它很可能要快
其他提示
我刚刚重新安装了Windows,所以未安装Visual Studio,并且代码很丑陋
using System;
using System.Diagnostics;
public static class test{
public static void Main(string[] args){
MyTest();
PowTest();
}
static void PowTest(){
var sw = Stopwatch.StartNew();
double res = 0;
for (int i = 0; i < 333333333; i++){
res = Math.Pow(i,30); //pow(i,30)
}
Console.WriteLine("Math.Pow: " + sw.ElapsedMilliseconds + " ms: " + res);
}
static void MyTest(){
var sw = Stopwatch.StartNew();
double res = 0;
for (int i = 0; i < 333333333; i++){
res = MyPow(i,30);
}
Console.WriteLine("MyPow: " + sw.ElapsedMilliseconds + " ms: " + res);
}
static double MyPow(double num, int exp)
{
double result = 1.0;
while (exp > 0)
{
if (exp % 2 == 1)
result *= num;
exp >>= 1;
num *= num;
}
return result;
}
}
结果:
csc /o 测试.cs
测试程序
MyPow: 6224 ms: 4.8569351667866E+255
Math.Pow: 43350 ms: 4.8569351667866E+255
通过平方求幂(参见 https://stackoverflow.com/questions/101439/the-most-efficient-way-to-implement-an-integer-based-power-function-powint-int) 在我的测试中比 Math.Pow 快得多(我的 CPU 是 2 Ghz 的 Pentium T3200)
编辑:.NET版本是3.5 SP1,操作系统是Vista SP1,电源计划是高性能。
从10年以上优化的图像处理&科学计算拇指的几个规则:
在一个算法级优化在低水平击败优化的任何量。尽管“写明显的,然后优化”传统智慧这必须在开始时进行。后不
手编码的数学运算(尤其是SIMD SSE +类型)通常将优于完全错误校验,广义内置的。
,其中,编译器预先知道需要做由编译器优化什么的任何操作。这些包括:
1.存储器操作,如Array.Copy()
2.对于其中阵列长度被给予超过阵列环路。作为在(..; i<array.Length;..
)
总是设定不切实际的目标(如果你愿意的话)。
我刚好这个昨天已经测试,然后看到你的问题了。
在我的机器,酷睿2运行1个测试线程,这是更快的乘法使用最多的一个9.因子在10,Math.Pow(B,E)更快。
然而,即使在的2倍,结果往往不相同的。有舍入误差。
一些算法是舍入误差非常敏感。我不得不从字面上超过一百万的随机试验运行,直到我发现了这一点。
我检查,并Math.Pow()
被定义为采取两个双打。这意味着它不能做重复乘法,但必须使用较普遍的办法。如果有一个Math.Pow(double, int)
,它很可能是更有效的。
如此说来,性能差异几乎可以肯定绝对是微不足道的,所以你应该使用哪个更清晰。微优化像这样的几乎都是没有意义的,可以在几乎任何时候出台,并应留给开发过程的结束。在这一点上,您可以检查是否该软件是太慢了,这里的热点,花你的微优化工作在那里将真正发挥作用。
这是使微,你也许应该基准它特定的平台,我不认为一个Pentium Pro的结果将是必然的相同的ARM或Pentium II。
所有的一切,这是最有可能是完全不相干的。
让我们使用惯例x ^ N。假设n为总是整数。
对于n的值较小,镗乘法会更快,因为Math.Pow(有可能的,依赖于实现的)使用花式算法以允许n至是非整数和/或负的。
对于n值很大,Math.Pow可能会更快,但如果你的库是不是很聪明,将使用相同的算法,如果你知道,n是总是整数这是不理想的。对于您可以编写了或其它精美的算法rel="nofollow noreferrer">幂。
当然,现代的计算机都非常快,你应该坚持最简单的,最容易阅读,最可能是马车方法,直到你测试程序,并确信您将使用不同的算法得到显著加速。
我不同意handbuilt功能总是快。余弦函数的方式更快,更准确的比什么我可以写。至于POW()。我做了一个快速测试,看看慢Math.pow()是如何在JavaScript中,因为迈赫达德告诫不要猜测
for (i3 = 0; i3 < 50000; ++i3) {
for(n=0; n < 9000;n++){
x=x*Math.cos(i3);
}
}
这里的结果:
Each function run 50000 times
time for 50000 Math.cos(i) calls = 8 ms
time for 50000 Math.pow(Math.cos(i),9000) calls = 21 ms
time for 50000 Math.pow(Math.cos(i),9000000) calls = 16 ms
time for 50000 homemade for loop calls 1065 ms
如果您不同意尝试 HTTP程序://www.m0ose。 COM / Javascript角/ speedtests / powSpeedTest.html
Math.Pow(x, y)
通常内部计算作为Math.Exp(Math.Log(x) * y)
。埃维功率方程需要找到一个自然对数,乘法,和提高e
到电源。
正如我在我以前的答复中提到,仅在10的倍数确实Math.Pow()
变得更快,但是精度如果使用的是一系列的乘法会受到影响。