Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:计算数组排序所需的时间_Java_Arrays_Sorting_Timer - Fatal编程技术网

Java:计算数组排序所需的时间

Java:计算数组排序所需的时间,java,arrays,sorting,timer,Java,Arrays,Sorting,Timer,我有一些代码可以在一个数组中生成1000个数字,然后对它们进行排序: import java.util.Arrays; import java.util.Random; public class OppgA { public static void main(String[] args) { int[] anArray; anArray = new int[1000]; Random generator = new Random();

我有一些代码可以在一个数组中生成1000个数字,然后对它们进行排序:

import java.util.Arrays;
import java.util.Random;


public class OppgA {
    public static void main(String[] args) {
        int[] anArray;
        anArray = new int[1000];
        Random generator = new Random();
        for(int i=0; i<1000; i++){
            anArray[i] = (generator.nextInt(1000)+1);
        }
        Arrays.sort(anArray);
        System.out.println(Arrays.toString(anArray));

    }

}
导入java.util.array;
导入java.util.Random;
公开课{
公共静态void main(字符串[]args){
国际[]无秩序;
anArray=新整数[1000];
随机生成器=新随机();

对于排序前的(int i=0;i),声明一个与开始排序前的时间相对应的long:

long timeStarted = System.currentTimeMillis();
//your sorting here.

//after sorting
System.out.println("Sorting last for:" + (System.currentTimeMillis() - timeStarted)); 
结果将返回与排序相同的毫秒数


正如assylias评论的那样,如果您希望精确测量经过的时间,您也可以使用
System.nanoTime()

在开始计算之前,或者在生成数组之后,您可以使用它来获得精确的时间,并在完成排序之后执行相同的操作,然后找到差异。

这样做:

long beforeTime = System.currentTimeMillis();

// Your Code

long afterTime = System.currentTimeMillis();

long diffInMilliSeconds = afterTime- beforeTime;
long start=System.currentTimeMillis();
您的排序代码
long end=System.currentTimeMillis();
long-timeInMillis=end-start;

希望对您有所帮助。

您可以在调用
Arrays.sort()
前后调用(并存储的结果)-不同之处在于所花费的时间(以纳秒为单位)。在计算持续时间时,该方法优于
System.currentTimeMillis

long start = System.nanoTime();
Arrays.sort(anArray);
long end = System.nanoTime();
long timeInMillis = TimeUnit.MILLISECONDS.convert(end - start, TimeUnit.NANOSECONDS);
System.out.println("Time spend in ms: " + timeInMillis);
但是请注意,如果您多次运行该程序,测量结果可能会有很大的差异。要获得更精确的计算,需要更多的参与-例如,请参阅:。

import java.util.Arrays;
导入java.util.Random;
公开课{
公共静态void main(字符串[]args){
国际[]无秩序;
anArray=新整数[1000];
随机生成器=新随机();

对于(int i=0;i适当的微基准标记是使用现成的工具完成的,如谷歌卡钳或Oracle jmh。但是,如果您想要穷人版,请至少遵循以下几点:

  • 使用
    System.nanoTime()
    (如其他地方所述)进行测量。不要相信小的数字:如果获得10微秒这样的计时,则表示测量的时间跨度太短。请放大阵列,使其至少达到毫秒

  • 多次重复排序过程(可能是10100次),并显示每次尝试的时间。在前几次运行后,您预计会看到时间明显下降,但在这之后,时间应该会稳定下来。如果您仍然观察到野生变化,您就知道出了问题
  • 为了避免垃圾收集问题,请重用相同的数组,但每次都用新的随机数据重新填充它

  • 这不是一个理想的方法,但这会起作用

        long startingTime=System.currentTimeMillis();
        Arrays.sort(anArray);
        long endTime=System.currentTimeMillis();
        System.out.println("Sorting time: "+(endTime-startingTime)+"ms");
    
    以下可能是最好的方法

        long startingTime=System.nanoTime();
        Arrays.sort(anArray);
        long endTime=System.nanoTime();
        System.out.println("Sorting time: "+(endTime-startingTime)+"ns");
    

    简而言之,您可以将我们的代码提取到一个方法,然后计算该方法的开始和结束时间戳之间的差异,或者您可以在探查器或IDE中运行它,它将打印执行时间

    理想情况下,您不应将业务逻辑(本例中为数组排序)与“度量”内容混为一谈。如果您确实需要测量应用程序内的执行时间,您可以尝试使用AOP进行测量


    请参考这篇文章,它非常详细地描述了可能的解决方案

    System.nanotime优先于System.currentTimeMillis来计算持续时间…+1这是可以添加到代码中的最基本的分析形式…为了获得更好的结果,请尝试更大的数组并对其进行排序…这将更好地了解计算机的运行速度java正在对数据进行排序。如果您认为
    nanoTime
    给出了一个“非常准确”的值,那么您就错了结果。名称有误导性:
    currentTimeMillis
    可能会以100分之一秒甚至10分之一秒的粒度报告。
    nanoTime
    本身永远不会超过微秒。你是对的。它应该是精确的,而不是精确的。@assylias:你应该回答这个问题。所有当前的人都使用System.currentTimeMillis(),这不是最佳解决方案。@marounnaroun:确实是::-)@JBNizet-LOL。我没想到..“多次重复排序过程”:并丢弃前N个结果以说明热身。@Thilo个人认为,我是手动执行该步骤的。显示所有结果并手动评估它们。性能提升很容易发现,以及可能发生的任何异常情况。
        long startingTime=System.nanoTime();
        Arrays.sort(anArray);
        long endTime=System.nanoTime();
        System.out.println("Sorting time: "+(endTime-startingTime)+"ns");