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 1
|
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 可以优化为表. 可以优化为树. 可以优化为二级查表.
|