gpt4 book ai didi

Java nanoTime 没有抛出可靠的结果

转载 作者:行者123 更新时间:2023-12-01 19:28:24 24 4
gpt4 key购买 nike

我正在做一个项目,需要在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com