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个方法test1和test2 ,并将编译后的字节代码的主要部分(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的顺序是不同的。 但是test1和test2两种方法的运算总和是相等的! 所以字节码的性能也应该相同。
有一种方法可以让您查看热点引擎生成的处理器指令 。