首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java elapsedTime()公式

Java elapsedTime()公式
EN

Stack Overflow用户
提问于 2014-09-09 17:52:57
回答 3查看 216关注 0票数 3

我正在为fibonacci算法做一个小项目。

我使用下面的方法来计算算法。注意,elapsedTime()返回一个double

代码语言:javascript
复制
public static void fibonacciSequence(long n1, long n2) {

    t0 = stopwatch.elapsedTime();
    System.out.print("index: " + index + " -> " + n1 + "\t");
    t1 = stopwatch.elapsedTime();
    lapTime = (1000 * t1 - 1000 * t0) / 1000;
    StdOut.println(" (" + lapTime + "\t " + t1 + ")");

    if (index == stoppingPoint) {
        return;
    }
    index++;
    fibonacciSequence(n2, n1 + n2);
}

现在,不要过多地关注算法本身--它是固定的。我只是不明白lapTime的公式。为什么不能

代码语言:javascript
复制
lapTime = t1-t0; 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-09 18:03:25

这属于来自Java普林斯顿StdlibJava普林斯顿Stdlib类。这个类是用来度量算法执行时间的。实现如下(删除注释和此类数据):

代码语言:javascript
复制
public class Stopwatch { 

    private final long start;

    public Stopwatch() {
        start = System.currentTimeMillis();
    } 

    public double elapsedTime() {
        long now = System.currentTimeMillis();
        return (now - start) / 1000.0;
    }
}

由于它使用的是System.currentTimeMillis(),所以它的工作时间为毫秒。但是elapsedTime方法已经将其转换为秒,但作为一个double。所以你现在的公式是:

代码语言:javascript
复制
lapTime = (1000 * t1 - 1000 * t0) / 1000;

确保将数据转换为纯double操作。因此,公式可以重写为:

代码语言:javascript
复制
lapTime = t1 - t0;

没有问题。

注意,仍然是,这不是度量代码执行时间的正确方法。您应该使用System.nanoTime()代替。

更多信息:

为了更深入地理解这些操作之间是否没有区别,让我们创建一个基本测试:

代码语言:javascript
复制
public class FormulaTest {
    static double formula1(double t0, double t1) {
        return (1000 * t1 - 1000 * t0) / 1000;
    }

    static double formula2(double t0, double t1) {
        return t1 - t0;
    }

    static void printResults(double t0, double t1) {
        System.out.println("t0: " + t0);
        System.out.println("t1: " + t1);
        System.out.println("Formula1: " + formula1(t0, t1));
        System.out.println("Formula2: " + formula1(t0, t1));
        System.out.println("---------------------------------------------------");
    }

    public static void main(String[] args) throws java.lang.Exception {
        // your code goes here
        printResults(0, 10);
        printResults(System.currentTimeMillis(), System.currentTimeMillis());
        printResults(System.currentTimeMillis(), System.currentTimeMillis() + 142);
        printResults(1.7976931348623157e+300 - 5000, 1.7976931348623157e+300);
        printResults(
            109999999999999999999999999999999999999999999999999999999999999999999999.0,
            119999999999999999999999999999999999999999999999999999999999999999999999.0);
        printResults(
            10.9999999999999999999999999999999999999999999999999999999999999999999999,
            11.9999999999999999999999999999999999999999999999999999999999999999999999);
        printResults(
            823145321462149234.651985149616914621346234923149621346921394613293423951932415934159213226314,
            844329146321496321.532159341563149513495139159341593415793415431951349513891585443951391593151);
        printResults(
            82314532.1462149234651985149616914621346234923149621346921394613293423951932415934159213226314,
            84432914.6321496321532159341563149513495139159341593415793415431951349513891585443951391593151);
        printResults(1.7976931348623157e+307, 4.9e-323);
        printResults(Double.MAX_VALUE, Double.MAX_VALUE);
        printResults(Double.MIN_VALUE - 10, Double.MIN_VALUE);
    }
}

输出:

代码语言:javascript
复制
t0: 0.0
t1: 10.0
Formula1: 10.0
Formula2: 10.0
---------------------------------------------------
t0: 1.410290897577E12
t1: 1.410290897577E12
Formula1: 0.0
Formula2: 0.0
---------------------------------------------------
t0: 1.410290897577E12
t1: 1.410290897719E12
Formula1: 142.0
Formula2: 142.0
---------------------------------------------------
t0: 1.7976931348623156E300
t1: 1.7976931348623156E300
Formula1: 0.0
Formula2: 0.0
---------------------------------------------------
t0: 1.1E71
t1: 1.2E71
Formula1: 9.999999999999985E69
Formula2: 9.999999999999985E69
---------------------------------------------------
t0: 11.0
t1: 12.0
Formula1: 1.0
Formula2: 1.0
---------------------------------------------------
t0: 8.2314532146214925E17
t1: 8.4432914632149632E17
Formula1: 2.1183824859347024E16
Formula2: 2.1183824859347024E16
---------------------------------------------------
t0: 8.231453214621492E7
t1: 8.443291463214964E7
Formula1: 2118382.4859347227
Formula2: 2118382.4859347227
---------------------------------------------------
t0: 1.7976931348623158E307
t1: 4.9E-323
Formula1: -Infinity
Formula2: -Infinity
---------------------------------------------------
t0: 1.7976931348623157E308
t1: 1.7976931348623157E308
Formula1: NaN
Formula2: NaN
---------------------------------------------------
t0: -10.0
t1: 4.9E-324
Formula1: 10.0
Formula2: 10.0
---------------------------------------------------

即使在边缘情况下,Double.MAX_VALUEDouble.MIN_VALUE公式的结果也是不同的。即使结果是-InfinityNaN (不是一个数字)。

简而言之:使用最后一个公式:

代码语言:javascript
复制
lapTime = t1 - t0;
票数 0
EN

Stack Overflow用户

发布于 2014-09-09 18:31:32

用于计算变量lapTime的表达式可以简化,并且您已经发布了它所具有的最简单的表示形式。

代码语言:javascript
复制
lapTime = (1000 * t1 - 1000 * t0) / 1000; 

取而代之的是:

代码语言:javascript
复制
lapTime = t1 - t0;

它可以通过简单代数来确定。甚至有可能,考虑到t1t0double,这两个表达式可能产生不同的值,即使它们在数学上是等价的。看这里

就您想要解决的问题而言,度量Java程序有龙的执行时间。这是我用微基准测量的自己的尝试,我最终认为这是一个失败。

票数 1
EN

Stack Overflow用户

发布于 2014-09-09 17:58:17

应该是的。

代码语言:javascript
复制
(a * x - a * y) / a == (x - y) * a / a == x - y

就你而言:

代码语言:javascript
复制
(1000 * t1 - 1000 * t0) / 1000 == (t1 - t0) * 1000 / 1000 == t1 - t0

因此,编写lapTime = t1-t0是个好主意,因为它使代码更容易理解。

此外,您还避免了long溢出的风险,不再乘以1000

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

https://stackoverflow.com/questions/25750945

复制
相关文章

相似问题

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