跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • jdk 8 怎么和 jdk 15.1 差距这么大?
未分類
11 11 月 2020

jdk 8 怎么和 jdk 15.1 差距这么大?

jdk 8 怎么和 jdk 15.1 差距这么大?

資深大佬 : GTD 8

主写了两个排序方法,一个是选择排序,一个是插入排序,代码肯定是没有任何问题的

在 macOS 下的 jdk 15.1,跑出来是这样的: jdk 8 怎么和 jdk 15.1 差距这么大?

在虚拟机 ubuntu 的 openjdk 8 中,跑出来是这样的: jdk 8 怎么和 jdk 15.1 差距这么大?

为什么会这样呢?同样一份代码,在 jdk 15.1 下,插入排序的 random array 怎么比选择排序慢了这么多?

大佬有話說 (23)

  • 資深大佬 : nguoidiqua

    Ubuntu 上用 openJDK15 跑呢?

  • 主 資深大佬 : GTD

    另附一个 jdk 15.1 在 macOS 终端跑的截图,因为试了很多次,应该不存在随机性
    ![]( https://tva1.sinaimg.cn/large/0081Kckwgy1gkupk5dpa9j30xs0qsnej.jpg)

  • 資深大佬 : jedrek

    主什么虚拟机软件?

  • 主 資深大佬 : GTD

    @nguoidiqua #1 试了一下,用了 openjdk 11,神奇的事情出现了

    竟然跟 macOS 的 15.1 一样,插入排序慢很多

    ![]( https://tva1.sinaimg.cn/large/0081Kckwgy1gkupvmzet7j315e0pyn3f.jpg)

  • 主 資深大佬 : GTD

    @jedrek #3 vmware fusion 12 pro

  • 主 資深大佬 : GTD

    这是我插入排序的源代码:

    public static <E extends Comparable<E>> void sort(E[] arr){

    for(int i = 0; i < arr.length; i ++){

    E t = arr[i];
    int j;
    for(j = i; j – 1 >= 0 && t.compareTo(arr[j – 1]) < 0; j –){
    arr[j] = arr[j – 1];
    }
    arr[j] = t;
    }
    }

  • 資深大佬 : yanzhiling2001

    虽然不知道为什么,我感觉你需要 www.injdk.cn

  • 資深大佬 : oldshensheep

    看代码运行结果,可以看出来代码的随机数种子应该是固定的。所以可以排除随机数种子的问题。
    那就可能是 jdk 版本不同,生成的随机数不同?但是这感觉不太可能,根据结果看生成的随机数应该是一样的。
    那就是虚拟机的问题?
    还是什么……
    可以把全部代码贴上来,测试测试。推荐在这个网站粘贴 https://paste.ubuntu.com/

  • 主 資深大佬 : GTD

    @oldshensheep #8 多谢

    应该不是随机数的问题,也不是 ubuntu 的问题,因为在 ubuntu 不同的 jdk,最后时间也不一样

    代码: https://paste.ubuntu.com/p/NFcDMsvNdH/

  • 資深大佬 : jasonkayzk

    难道是 GC 的问题?
    说实话,只有 JDK11 刚出的时候,研究了一下 ZGC ;后面,因为 JDK 11 目前不支持 Android,后面又用回 8 了;
    之后再也没研究过 JDK 新版本……

  • 資深大佬 : secondwtq

    你这代码根本就没法用来做 benchmark
    我记得 Java 做性能测试要用一个专门的库。JVM 会有一个 JIT 的策略,决定什么时候优化哪里的代码,不同的 JVM 版本这个可能会变。要测试性能,你得把这个拉平了。
    如果最后在同样的优化等级下还是有 regression 的话,那恭喜主可以给 JVM 贡献代码了。

  • 資深大佬 : Cbdy

    刚刚简单了写了一个
    https://gist.github.com/cbdyzj/00bf90ae5def3609c3831b107ec89c21

  • 資深大佬 : oldshensheep

    测试了一下,用的 jdk11,13,14,结果和主的一样。jdk8 的结果也和主一样。
    jdk8 的排序速度都差不多,jdk11,13,14 的插入和选择排序速度比是 1:2 。
    ![]( https://i.bmp.ovh/imgs/2020/11/b40a4e4ab9baf054.png)

    这可以说是负优化吗……,是由什么引起的呢?
    另外我上面的回复说的随机数种子的问题是我想错了……

  • 主 資深大佬 : GTD

    @Cbdy 诶对啊,你这个差不多也是 1:2,这两个算法时间复杂度都是 o ( n ) 2 才对,不应该差距这么大

  • 資深大佬 : Cbdy

    @GTD 时间复杂度 O(n^2)的意思是,随着 n 的增长,时间复杂度呈 n^2 增长,并不是两个相同时间复杂度的算法花费的时间是一样的

    比如两个算法,一个算法花的时间是 n,另一个是 10000n,他们的时间复杂度都是 O(n),但他们花费的时间相差一万倍

    另外,现代计算机其实对于交换和比较的耗时其实是有差别的,另外,不同排序算法对 CPU 缓存的命中率也会影响排序的速度

    我稍微看了一下你的代码,有个点注意一下,Java 数组本身就是协变的,没必要加那个协变泛型标注

  • 主 資深大佬 : GTD

    @Cbdy #15

    不是啊,问题是为什么 jdk 11 以上,插入排序慢了一倍,而选择排序速度不变?跑了几遍都一样,这肯定跟算法和代码没关系

  • 主 資深大佬 : GTD

    @Cbdy #15 不过谢谢你的回复,就很灵异,jdk 8 下两个算法不论跑多少遍,都约等于 1:1,到了 jdk 11 以上,两个算法不论跑多少遍,都约等于 1:2 。这个解释不通啊

  • 資深大佬 : liuhuan475

    等一手大佬回复

  • 資深大佬 : Jooooooooo

    看下 GC 日志

    不同版本默认 GC 参数会有差异

  • 資深大佬 : socket1q1

    等一手大佬回复

  • 資深大佬 : acmore

    从 Java 9 开始默认 GC Collector 从 Parallel GC 切换为了 G1 。再根据你切换垃圾回收策略对结果的影响来看,GC 应该是主要问题,可以找找看不同策略的侧重和注意事项。

  • 資深大佬 : securityCoding

    @secondwtq jmh,压测一定要用这个

  • 資深大佬 : sagaxu

    就是 gc 不同,试试 zgc 和 epsilongc

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具