java - 为什么添加一行计算会减少运行时间?

标签 java

在测试我的 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 毫秒(使用相同的测试条件) .

这是什么原因造成的?

最佳答案

循环中的值是常量,它们不依赖于迭代器。因此这些值始终相同。

    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。这(根据您自己的证据)更容易计算机化。

关于java - 为什么添加一行计算会减少运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11437051/

相关文章:

java - 为每个RecyclerView项目创建DetailsActivity

java - 在java中实现能够处理数组列表、链表和双向链表的SelectionSort

java - 如何将 arraylist 字符串值加一

java - 如何在 JPA/Hibernate 中按聚合列排序?

java - 如何使用 Quickbooks Online v3 Java SDK 向客户发送发票电子邮件?

java - 什么是原始类型,为什么我们不应该使用它呢?

java - Maven阴影插件构建的无效或损坏的JAR文件

java - Spring Data Mongo @Column 等效注解(@Property?)

java - Java 中的泛型方法应该具有什么签名,以便它可以接受任何实现 Iteralbe 并存储 List<U>> 和...的 <T?

java - 如何使用 httpPost 将数据发送到网站,应用程序崩溃