Java 7 排序“优化”

2022-09-01 19:28:47

在 Java6 中,快速排序和合并排序分别用于 基元数组和对象数组。在Java7中,它们都已更改为DualPivotQuicksort和Timsort。Arrays#sort

在新快速排序的源代码中,以下注释出现在几个位置(例如第354行):

 /*
  * Here and below we use "a[i] = b; i++;" instead
  * of "a[i++] = b;" due to performance issue.
  */

这如何成为性能问题?编译器不会将这些简化为相同的内容吗?

更广泛地说,我自己调查这个问题的好策略是什么?我可以运行基准测试,但我更感兴趣的是分析编译代码中的任何差异。但是,我不知道该使用什么工具等。


答案 1

这只是对一般问题的回答。

您可以查看字节码并尝试了解差异。也就是说,你可以用两者给自己写一个简单的例子,看看有什么区别。a[i] = b; i++;a[i++] = b;

显示字节码的最简单方法是程序(应包含在JDK中)。使用代码编译代码并在代码上运行 javap:(-c 开关告诉 javap 输出文件中每个方法的字节码)。javapjavac SomeFile.javajavap -c SomeFile

如果你正在使用eclipse,你也可以试试这个


答案 2

我写了2个方法test1test2,并添加了编译字节码的主要部分(Snow Leopard上的Java 1.6)作为注释:

    /*
     *     14  iload_1 [b]      -> load value from address 1 to sack
     *     15  iastore          -> store value from stack into int array
     *     16  iinc 3 1 [i]     -> int increment value of address 3
     *     19  iinc 3 1 [i]     -> int increment value of address 3
     */
    public void test1() {
        int b = 0;
        int a[] = new int[10];
        for (int i=0; i<10; i++) {
            a[i] = b; 
            i++;
        }
    }

    /*
     *     14  iinc 3 1 [i]     -> increment value of address 3
     *     17  iload_1 [b]      -> load value from address 1 to stack
     *     18  iastore          -> store value from stack into int array
     *     19  iinc 3 1 [i]     -> increment value of address 3 
     */
    public void test2() {
        int b = 0;
        int a[] = new int[10];
        for (int i=0; i<10; i++) {
            a[i++] = b;
        }
    }

操作的顺序是不同的。但是两种方法 test1test2 的运算和是相等的!因此,字节码的性能也应该相同。inc


推荐