【问题标题】:Which one is faster to process between Math.pow() and using * operator several times?在 Math.pow() 和多次使用 * 运算符之间,哪一个处理得更快?
【发布时间】:2014-06-29 00:30:30
【问题描述】:

我正在编写一个 java 程序,可以将不同的数字提高到幂。在 Math.pow(8,4) 和 8*8*8*8 之间,哪一个的处理时间更短?

【问题讨论】:

  • 您是否已经尝试过使用for 循环执行这两种计算,比如说1,000,000 次? (只是为了比较执行时间)
  • 考虑到他们正在做同样的事情......
  • @xav 我没有尝试过使用大数字。让我试着回复你

标签: java


【解决方案1】:

Power 函数的效率大于循环。您可以通过以下方式检查每个函数所花费的时间:-

    double i=10;
    java.util.Date dt=new java.util.Date();
    double z=(long) Math.pow (8,i);
    java.util.Date dt1=new java.util.Date();
    System.out.println("Using Power formula:"+(dt1.getTime()-dt.getTime()));
    double t=1;
    for(double k=1;k<=i;k++){
        t*=8;
    }
    java.util.Date dt2=new java.util.Date();
    System.out.println("Using loop :"+(dt2.getTime()-dt1.getTime()));

【讨论】:

【解决方案2】:

对于像 8^4 这样的简单运算,手动乘法会更快。使用jmh 的微基准显示(纳秒/运算):

Benchmark                 Mode Thr    Cnt  Sec         Mean   Mean error    Units
c.a.p.SO23595573.mult     avgt   1      3    2        3.074        0.022  nsec/op
c.a.p.SO23595573.pow      avgt   1      3    2       68.696        0.186  nsec/op

代码:

private int x = 8;
private int y = 4;

@GenerateMicroBenchmark
public double mult() {
    double result = x;
    for (int i = 0; i < y - 1; i++) {
        result *= x;
    }
    return result;
}

@GenerateMicroBenchmark
public double pow() {
    return Math.pow(x, y);
}

【讨论】:

    【解决方案3】:

    这两个函数都将在编译时计算,并且具有相同的效率。

    【讨论】:

    • 有什么方法可以检查计算函数所用的时间吗?
    • 那是另一个问题。你试图得到什么?
    • 我尝试过使用大数字和计时器,但我无法观察到明显的差异。我只是为了确认差异
    • '当然,在用一两个数字进行运算时你不会得到它。做一个位数据集:1_000_000,例如
    • 让我试试。谢谢
    【解决方案4】:

    检查这个小代码

    long pr=1;
    long st=System.currentTimeMillis();
    for(int i=0;i<200_00_00_000;i++)
       pr=pr*8;
    long en=System.currentTimeMillis();
    System.out.println("Executiom time  : "+(en-st));
    

    它会给你这段代码的执行时间。
    Math.pow(8,200_00_00_000) 执行相同的操作,然后自己找出差异。

    P.SMath.pow() 执行速度更快。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多