在Java6中,Arrays#sort中同时使用了快速排序和合并排序,分别用于原始数组和对象数组。在Java7中,这两个属性都已更改为DualPivotQuicksort和Timsort。
在新的快速排序的源代码中,下面的注释出现在几个地方(如第354行):
/*
* Here and below we use "a[i] = b; i++;" instead
* of "a[i++] = b;" due to performance issue.
*/这怎么会是性能问题呢?编译器不会将它们简化为相同的东西吗?
更广泛地说,我自己调查这个问题的好策略是什么?我可以运行基准测试,但我更感兴趣的是分析编译代码中的任何差异。但是,我不知道该用什么工具等等。
发布于 2011-07-13 17:36:12
这只是对一般问题的一个回答。
您可以查看字节码并尝试理解其中的差异。也就是说,你可以同时使用a[i] = b; i++;和a[i++] = b;给自己写一个简单的例子,看看有什么不同。
显示字节码的最简单方法是javap程序(应该包含在JDK中)。使用javac SomeFile.java编译代码,并在以下代码上运行javap:javap -c SomeFile ( -c开关告诉javap输出文件中每个方法的字节码)。
如果你正在使用eclipse,你也可以试试this one。
发布于 2011-07-13 18:16:02
我编写了两个方法test1和test2,并添加了编译字节码的主要部分( Snow Leopard上的Java1.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操作的顺序不同。但是两个方法test1和test2的运算和是相等的!因此,字节码的性能也应该是相同的。
发布于 2011-07-13 18:15:55
有一种方法可以让您查看processor instructions generated by the hotspot engine。
https://stackoverflow.com/questions/6676836
复制相似问题