Java 7排序“优化”

在Java6中,quicksort和mergesort分别用于Arrays#sort ,用于原始和对象数组。 在Java7中,这些都改变了, DualPivotQuicksort和Timsort。

在新快速排序的来源中,以下评论出现在几个地方(例如第354行):

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

这是一个性能问题? 编译器不会将这些减少到同一个东西吗?

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

这只是一般问题的答案。

您可以查看字节码并尝试了解其中的差异。 也就是说,你可以用a[i] = b; i++;写一个简单的例子a[i] = b; i++; a[i] = b; i++;a[i++] = b; 看看有什么不同。

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

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

我编写了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; } } 

inc ops的顺序是不同的。 但是test1test2两种方法的运算总和是相等的! 所以字节码的性能也应该相同。

有一种方法可以让您查看热点引擎生成的处理器指令 。