
1 mxT52CRuqR6o5 2022-08-03 15:21:19 +08:00 你这里的 switch 可以优化成查表 |
2 xujinkai 2022-08-03 15:21:53 +08:00 via Android 我记得 switch 会优化成数组取下表,这样就不用一个一个匹配了 |
3 Leviathann 2022-08-03 15:27:39 +08:00 不要用测量前后时间的方式测计算密集的代码 |
4 lmshl 2022-08-03 15:38:00 +08:00 不考虑 JIT 介入的前提下: # for of 1. 循环 Array 会带来检查数组边界的开销,每次访问元素都要 check condition 2. getCameraType 是函数,函数需要跳转过去,再跳转回来 3. 发生了额外的三次内存访问,a) 堆获取枚举静态数组, b) 根据数组下标访问枚举对象引用, c) 根据对象引用访问堆内存地址取属性 # switch 而 switch 只有简简单单的 compare 和 jump ,高下立判 不是很懂 jvm ,仅根据操作系统印象胡诌几句 |
5 786375312123 2022-08-03 16:07:28 +08:00 一个是 map 查表,一个是 array 遍历 |
6 xtreme1 2022-08-03 16:14:52 +08:00 |
8 cpalead OP @Leviathann 为什么?有什么问题,不这样计算时间,怎么算时间 |
10 zmal 2022-08-03 18:09:22 +08:00 反编译后的字节码很清晰了:编译优化成查表后把枚举类进行了标量替换,tableswitch 里的数字应该是直接放在方法栈里,避免了去堆里访问对象,所以快了很多。 |
11 L4Linux 2022-08-03 18:10:19 +08:00 via Android Java 的性能不是这么比的 |
12 L4Linux 2022-08-03 18:12:17 +08:00 via Android 还有,挨个比数肯定慢啊。。。 |
13 shyling 2022-08-03 18:15:26 +08:00 可以研究下什么是 tableswitch |
14 superrichman 2022-08-03 18:19:34 +08:00 via Android 知道门牌号直接上门查水表比一家一户敲门快 |
15 cpalead OP 已经研究明白了 如果 case 的值是连续的,那么就会优化成一个数组,效率和原理跟 hashmap 或者数组下标访问的原理一样,那就是 o(1)的时间,如果不是连续的,就会使用二分查找去匹配,那么时间复杂度就是 o(log(n)) 而 for 的时间复杂度就是 n ,所以不如 switch 快! |
17 ibinary 2022-08-04 10:57:22 +08:00 遇到语法不懂得层面,就去 C++ 看看反汇编. 语法一样.看看人家底层怎么做得. switch 优化方式有很多种. 可以优化为 if 可以优化为表. 可以优化为树. 可以优化为二级查表. |