有人知道乘法运算符是否比使用 Math.Pow 方法更快吗?喜欢:

n * n * n

Math.Pow ( n, 3 )
有帮助吗?

解决方案

基本上,你应该的基准可查看。

受过教育的臆测(不可靠):

如果它不被一些编译器优化,以同样的事情...

这很可能是x * x * xMath.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">幂。

当然,现代的计算机都非常快,你应该坚持最简单的,最容易阅读,最可能是马车方法,直到你测试程序,并确信您将使用不同的算法得到显著加速。

Math.Pow(x, y)通常内部计算作为Math.Exp(Math.Log(x) * y)。埃维功率方程需要找到一个自然对数,乘法,和提高e到电源。

正如我在我以前的答复中提到,仅在10的倍数确实Math.Pow()变得更快,但是精度如果使用的是一系列的乘法会受到影响。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top