Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting_Optimization - Fatal编程技术网

Java 为什么对随机填充的数组进行排序会越来越快

Java 为什么对随机填充的数组进行排序会越来越快,java,sorting,optimization,Java,Sorting,Optimization,在编程练习中,我们被告知实现插入、选择和冒泡排序(java)。 我想测试排序的执行速度,所以我写了一个循环来随机填充和排序一个数组10次。前两种排序的时间大约是最后8次迭代的两倍。。为什么? 在这里,我把代码的相关部分放在这里 // class fields public static final int POPULATE_MAX = 1000000000; public static final int POPULATE_MIN = -1000000000; public static vo

在编程练习中,我们被告知实现插入、选择和冒泡排序(java)。 我想测试排序的执行速度,所以我写了一个循环来随机填充和排序一个数组10次。前两种排序的时间大约是最后8次迭代的两倍。。为什么?

在这里,我把代码的相关部分放在这里

// class fields
public static final int POPULATE_MAX = 1000000000;
public static final int POPULATE_MIN = -1000000000;

public static void populateRandom(int[] toPopulate)
{
    // populate array with random integers within bounds set by class fields
    for (int i = 0; i < toPopulate.length; i++)
    {
        toPopulate[i] = (int)(Math.random() * (POPULATE_MAX - POPULATE_MIN))
            + POPULATE_MIN;
    }
} // end of method populateRandom(int[] toPopulate)

public static void insertionSort(int[] toSort) throws IllegalArgumentException
{
    if (toSort == null)
    {
        throw new IllegalArgumentException();
    }
    if (toSort.length <= 1) return;

    int temp;

    // Index i points to the next unsorted element; assigned to temp
    for (int i = 1; i < toSort.length; i++)
    {
        temp = toSort[i];

        // This loop searches through the sorted portion of the array and
        // determines where to put the aforementioned unsorted element
        for (int j = i - 1; j >= 0; j--)
        {
            if (temp < toSort[j])
            {
                toSort[j + 1] = toSort[j];
                if(j == 0)
                    toSort[j] = temp;
            }
            else
            {
                toSort[j + 1] = temp;
                break;
            } // end of if (temp < toSort[j])
        } // end of for (int j = i - 1; j >= 0; j--)
    } // end of for (int i = 1; i < toSort.length; i++)
} // end of method insertionSort(int[] toSort) throws IllegalArgumentException

public static void main(String[] args)
{
    long time;
    for (int testRun = 0; testRun < 10; testRun++)
    {
        int[] array = new int[100000];
        System.out.print(testRun + "...");
        populateRandom(array);
        time = System.currentTimeMillis();
        insertionSort(array);
        time = System.currentTimeMillis() - time;
        for (int i = 0; i < array.length - 1; i++)
        {
            if (array[i] > array[i+1]) System.out.println(i + ". Bad");
        }
        System.out.println(time + " Done");
    }
    System.out.println("ABS Done");
}
//类字段
公共静态最终整数填充_MAX=100000000;
公共静态最终整数填充_MIN=-100000000;
公共静态void populateRandom(int[]toPopulate)
{
//使用类字段设置的边界内的随机整数填充数组
对于(int i=0;i=0;j--)
}//for的结尾(int i=1;iarray[i+1])System.out.println(i+“.Bad”);
}
System.out.println(时间+“完成”);
}
系统输出打印项次(“ABS完成”);
}

我猜这与分支预测有关,但我不确定为什么后续排序速度会明显加快。

可能在前几次迭代中,JVM以解释模式运行,然后它会注意到重复运行相同的方法,并将其编译为本机代码。如果调用同一方法的次数更多,甚至可能导致进一步的优化“启动”


因为JVM是这样工作的,所以在进行性能测量之前,您应该始终预热JVM。基本上,在循环中多次运行要作为基准的代码,然后进行测量。(注意:这应该发生在单个JVM进程运行的空间内——如果JVM退出并再次启动,您就回到原点了。)

可能您的JVM在前几次迭代中以解释模式运行,然后它会注意到您重复运行同一方法,并将其编译为本机代码。如果调用同一方法的次数更多,甚至可能导致进一步的优化“启动”


因为JVM是这样工作的,所以在进行性能测量之前,您应该始终预热JVM。基本上,在循环中多次运行要作为基准的代码,然后进行测量。(注意:这应该发生在单个JVM进程运行的空间内——如果JVM退出并再次启动,您就回到原点了。)

您可以发布进行测试的代码吗?所有相关代码都在main(字符串[])中。。。它创建数组并对排序进行计时1。分支预测在如此长的时间跨度内不起作用。2.注释右括号是愚蠢的垃圾邮件。不要这样做,写方法要短到你自己都能看到这样的评论是多么可笑。对不起。。。老师强迫我们为每件事评论结尾括号;文件标记为其他。我讨厌如此冗长的评论。你能发布进行测试的代码吗?所有相关的代码都在main(String[])。。。它创建数组并对排序进行计时1。分支预测在如此长的时间跨度内不起作用。2.注释右括号是愚蠢的垃圾邮件。不要这样做,写方法要短到你自己都能看到这样的评论是多么可笑。对不起。。。老师强迫我们为每件事评论结尾括号;文件标记为其他。我讨厌如此冗长的评论。我倾向于在一个无限循环中运行测试工具,打印每次运行的结果,然后观察直到结果趋于稳定。在报告时间之前,每次运行仍应在循环中多次调用测试代码,以便时间测量具有足够的精度,具有意义。此技术还有助于隔离由于操作系统进程/线程调度而产生的峰值。我倾向于在一个无限循环中运行测试工具,打印每次运行的结果,然后观察直到结果趋于稳定。在报告时间之前,每次运行仍应在循环中多次调用测试代码,以便时间测量具有足够的精度,具有意义。此技术还有助于隔离操作系统进程/线程调度导致的峰值。