【问题标题】:Calculating average time to complete a function in java计算在java中完成一个函数的平均时间
【发布时间】:2020-03-04 21:21:33
【问题描述】:

我正在运行一个简单的排序 1000 次,并试图根据用户定义的数组长度获得完成(然后与另一个排序比较)所需的平均时间。我的问题是,当我尝试获取时间时,它始终为 0。我有一段时间没有编码,也没有看到我的错误。

import java.util.Scanner;

public class TimingExpBubble2 {
    public static long average(long[] arr){
        int sum = 0; 

        for (int i = 0; i < arr.length; i++) 
            sum += arr[i]; 

        return sum / arr.length; 
    }
    public static void main(String args[]) {
        Scanner reader = new Scanner(System.in);
        System.out.println("Enter array length: ");
        int x = reader.nextInt();
        long[] time = new long[1000];
        for(int i = 0; i < 1000; i++)
        {
            int[] arr = new int[x];
            for(int j = 0; j < arr.length; j++) {
                arr[j] = (int) (Math.random() * 5000);
            }
            long start = System.currentTimeMillis();

            for (int l = 0; l < arr.length - 1; l++) {
                for (int j = 1; j < arr.length - i; j++) {
                    if (arr[j - 1] > arr[j]) {
                        int temp = arr[j - 1];
                        arr[j - 1] = arr[j];
                        arr[j] = temp;
                    }
                }
            }
            reader.close();
            long end = System.currentTimeMillis();
            time[i] = (end - start);
        }
        System.out.println("Average time in Miliseconds: " + average(time));
    }

}
'''

【问题讨论】:

  • 使用 System.nanoTime()
  • 在大多数情况下(我的测试),排序为 0 毫秒,超过 10 个元素的数组。这往往会在 1000 次迭代中产生一个非常小的值(1-3 毫秒),因此结果平均为 0.003 毫秒(例如) - 而不是使用 long 作为结果,您将需要使用double - 这将要求您将可整除的值之一更改为 double
  • 我可能很想使用java.time API,它支持Duration - 但这样做可能会带来额外的开销:/
  • 将其更改为双精度或使用 nano 都可以。感谢您的输入

标签: java arrays loops


【解决方案1】:

您需要使用System.nanoTime() 而不是System.currentTimeMillis()

【讨论】:

  • 使用 nano 也可以。感谢您的快速回复。
【解决方案2】:

我在朋友的帮助下想通了。 我需要将我的时间变量和测量值加倍,因为数量如此之小,它有助于仅使用运行变量而不是数组 '''

time = time + (end - start);
        }
        System.out.println("Average time in Miliseconds: " + (time / 1000));

'''

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多