Java nanoTime 没有抛出可靠的结果

标签 java algorithm sorting execution-time nanotime

我正在做一个项目,需要在 999 个随机 double 组中实现冒泡排序、希尔排序和快速排序算法。

我需要测量每个算法运行所需的时间。

我正在使用 System.nanoTime() 来测量每个算法的执行时间。我有 3 个按钮,每种算法一个。单击按钮后,计时器启动,调用该函数,然后调用结束计时器,并通过 endtime-starttime 计算持续时间。然后,持续时间会打印在按钮顶部的标签上。

public double[] randomArray = SortAlg.getArray();

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        long startTimeBubble = System.nanoTime();
        SortAlg.bubble(randomArray);
        long endTimeBubble = System.nanoTime();
        long durationBubble = (endTimeBubble - startTimeBubble) / 1000000;
        bubbleTiempo.setText("bubble took " + durationBubble + " ms");
    }                                        

    private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        long startTimeShellSort = System.nanoTime();
        SortAlg.shellSort(randomArray);
        long endTimeShellSort = System.nanoTime();
        long durationShellSort = (endTimeShellSort - startTimeShellSort) / 1000000;
        shellSortTime.setText("ShellSort took " + durationShellSort + " ms");
    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        long startTimeQuickSort = System.nanoTime();
        SortAlg.quickSort(randomArray, 0, randomArray.length - 1);
        long endTimeQuickSort = System.nanoTime();
        long durationQuickSort = (endTimeQuickSort - startTimeQuickSort) / 1000000;
        quickSortTime.setText("Quicksort took " + durationQuickSort + " ms");
    } 

一般说明: 1-getArray() 生成一个由 0 到 2000 之间的 999 个实数( double )组成的随机数组。

2-所有算法方法都不会返回数组,因此此 randomArray 不会保存为已排序的数组,因此,每次单击按钮时,传递到函数中的随机数组都是未排序的。

3-每个按钮都有一个唯一的标签来显示结果。

4-您所看到的内容来 self 使用 Netbeans GUI 编辑器创建的 GUI 类,即按钮部分。 Main 只是创建一个新的 GUI 框架并将其设置为可见,而 SortAlg 包含算法的逻辑,我已经测试过该逻辑可以正常工作。

但是我这里有两个问题:如果我点击按钮超过 1 次,每次点击的时间都会进一步减少,直到最终为 0,这是没有意义的。

此外,我最初遇到了计算错误,我将所用时间除以 100000 而不是 1000000,但奇怪的是,这从未给我带来任何错误。当我将它除以 1000000 时(这应该是将 ns 转换为 ms 的正确操作),我有时会得到 0 MS 执行时间,这又没有意义。

最后,我知道这可能很难确定,但我的印象是快速排序一定是最快的算法?但它们的执行时间在构建中差异很大。有时每个是 5 毫秒,有时是 30 毫秒,有时是 68 毫秒。我很担心,因为似乎第一个点击的总是最快的,而其他的最终会慢一些。我对这些结果一点信心都没有。

最佳答案

When I divide it by 1000000 though (which should be the correct operation for converting ns to ms) I sometimes get 0 MS execution time, which again makes no sense.

因为您使用的是整数除法:

long durationBubble = (endTimeBubble - startTimeBubble) / 1000000;
                                                          ^^^^^^^

只需将其替换为 double 即可包含分数:

double durationBubble = (endTimeBubble - startTimeBubble) / 1_000_000.0;
<小时/>

参见:

关于Java nanoTime 没有抛出可靠的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60664200/

相关文章:

java - 正则表达式性能问题

java - 如何避免在 Java 中的 Arraylist 类中添加重复的数据

algorithm - 在对数时间内计算任何子串的散列

algorithm - 最长公共(public)子序列问题

java - 如何根据整数数组对对象集进行排序

java - 如何为java应用程序创建安装程序包以及在mysql中创建的数据库

Java (Groovy) LDAP 非 ASCII 字符

algorithm - 通过最大流约束找到未加权图中的最短路径

mysql - 在 MySQL 中对 varchar 字段进行数字排序

bash - unix 对 2 个字段的数字顺序进行排序