首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Math.Pow与乘法运算符(性能)

Math.Pow与乘法运算符(性能)
EN

Stack Overflow用户
提问于 2009-06-01 20:14:25
回答 9查看 57.5K关注 0票数 43

谁知道乘法运算符是否比使用Math.Pow方法更快?像这样:

代码语言:javascript
运行
复制
n * n * n

vs

代码语言:javascript
运行
复制
Math.Pow ( n, 3 )
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2009-06-01 20:16:42

基本上,您应该使用benchmark来查看。

有根据的猜测(不可靠):

以防某些编译器没有对其进行优化...

x * x * x很可能比Math.Pow(x, 3)更快,因为Math.Pow必须处理一般情况下的问题,处理分数幂和其他问题,而x * x * x只需要几条乘法指令,所以它很可能更快。

票数 36
EN

Stack Overflow用户

发布于 2009-06-01 21:33:55

我只是重新安装了windows,所以visual studio没有安装,代码也很难看。

代码语言:javascript
运行
复制
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 test.cs

test.exe

代码语言:javascript
运行
复制
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的奔腾T3200 )。

编辑:.NET版本是3.5 SP1,操作系统是Vista SP1,电源计划是高性能。

票数 46
EN

Stack Overflow用户

发布于 2011-06-08 11:07:08

以下是10+在图像处理和科学计算领域多年的优化经验:

算法级别的优化胜过低级别的任何数量的优化。尽管有“写出显而易见的东西,然后优化”的传统智慧,但这必须在一开始就完成。不是在那之后。

手工编码的数学运算(特别是单指令多指令SSE+类型)通常会优于完全错误检查的通用内置运算。

编译器预先知道需要做什么的任何操作都会被编译器优化。这些操作包括: 1.诸如Array.Copy()之类的内存操作2.在给定数组长度的数组上执行循环。如for (..; i<array.Length;..)所示

总是设定不切实际的目标(如果你想的话)。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/936541

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档