首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java 7排序“优化”

Java 7排序“优化”
EN

Stack Overflow用户
提问于 2011-07-13 17:29:30
回答 3查看 772关注 0票数 25

在Java6中,Arrays#sort中同时使用了快速排序和合并排序,分别用于原始数组和对象数组。在Java7中,这两个属性都已更改为DualPivotQuicksort和Timsort。

在新的快速排序的源代码中,下面的注释出现在几个地方(如第354行):

代码语言:javascript
复制
 /*
  * Here and below we use "a[i] = b; i++;" instead
  * of "a[i++] = b;" due to performance issue.
  */

这怎么会是性能问题呢?编译器不会将它们简化为相同的东西吗?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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

票数 7
EN

Stack Overflow用户

发布于 2011-07-13 18:16:02

我编写了两个方法test1和test2,并添加了编译字节码的主要部分( Snow Leopard上的Java1.6)作为注释:

代码语言:javascript
复制
    /*
     *     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的运算和是相等的!因此,字节码的性能也应该是相同的。

票数 5
EN

Stack Overflow用户

发布于 2011-07-13 18:15:55

有一种方法可以让您查看processor instructions generated by the hotspot engine

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6676836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档