【问题标题】:Why would adding a line of computation decrease runtime?为什么添加一行计算会减少运行时间?
【发布时间】:2012-07-11 07:56:08
【问题描述】:

在测试我的related questions 之一的答案时,我写道:

public static long timeDouble(int iters) {
    long start = System.currentTimeMillis();
    for (; iters >=0; iters--) {
        double a = 1.2, b = 2.246, c = 4.4924, d = 8.98488, e = 17.969772;
        a = Math.sqrt(a);
        b = Math.cos(b);
        c = Math.sin(c);
        d = Math.tan(d);
        e = a + b - c * d / (e + 1);
        e = Math.pow(e, e);
    }
    return System.currentTimeMillis() - start;
}

此方法的平均运行时间为 414 毫秒(使用 1000000 次迭代)。但是,有些东西让我添加了这一行:

e = e + d - c * b / (a + 1);

紧接在e = Math.pow(e, e);之前加上这行,计算这个方法的时间平均下降到206毫秒(使用相同的测试条件)。

这是什么原因造成的?

【问题讨论】:

  • 也许e 的值被该等式减小了,然后Math.pow(e, e) 将花费更少的时间来执行。
  • 这可能是由于 Math.pow(e, e) 使用较少的处理器周期,可能是由于 e 更小。
  • 上面的海报可能是正确的,但我一般会避开这种微基准测试,它有很多陷阱。 kdgregory.com/index.php?page=java.microBenchmark

标签: java


【解决方案1】:

循环中的值是常数,它们不依赖于iters。因此这些值始终是相同的。

    double a = 1.2, b = 2.246, c = 4.4924, d = 8.98488, e = 17.969772;
    a = Math.sqrt(a);
    b = Math.cos(b);
    c = Math.sin(c);
    d = Math.tan(d);
    e = a + b - c * d / (e + 1);
    e = Math.pow(e, e);

在第一个版本中,您将 e 计算为值 17.969772 ^ 17.969772。在第二个中,您计算​​ e 为值 0.69761863561124537 ^ 0.69761863561124537。这(根据您自己的证据)更容易计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2020-06-13
    • 2016-10-24
    • 2017-10-20
    相关资源
    最近更新 更多