22 个解决方案
#1
没有万能的改进方法,需具体问题具体分析,上代码。
#2
要精简case,那么你的算法就做到最优。
#3
有些时候,确实没办法。。。
#4
case的情况归类,然后switch类,再掉具体类的函数,函数里面小switch。
#5
额 不用!
#6
用 enum 定义 case 数值
将每一个 case 的处理写成单独的函数
加注释
将每一个 case 的处理写成单独的函数
加注释
#7
楼主的困难有2个方面
1,case分支太多,程序可读性变差
2,case分支太多,影响了程序的执行效率
如果是第1条,属于友好编码的范畴
如果是第2条,则是必须要解决的
对于这种问题,可以考虑采用 表驱动法
楼主不妨把具体的需求说一下,然后可以制定一个合适的 表驱动法 来解决
1,case分支太多,程序可读性变差
2,case分支太多,影响了程序的执行效率
如果是第1条,属于友好编码的范畴
如果是第2条,则是必须要解决的
对于这种问题,可以考虑采用 表驱动法
楼主不妨把具体的需求说一下,然后可以制定一个合适的 表驱动法 来解决
#8
C99 标准支持 case一个范围 比如 case 'A' ... 'Z': 楼主可以看看
#9
看你自己的需求。。这个一般不能改进。。。
#10
case太多,圈复杂度也太高
case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。
case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。
#11
我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了
#12
我想10L所说的执行效率应该是指运行速度吧。
switch-case结构的实现原理是向量表。编译程序会为每一个switch-case结构分配一个向量表,表元的大小为址长度(以32位系统为例就是4Byte),现假设向量表首地址为A。
case 0:后面的代码首地址存入A;
case 1:后面的代码首地址存入A+4;
case 2:后面的代码首地址存入A+8,照此类推。
不管case分支有多少,switch-case结构在运行时都只执行了两个指令:加法(add)和寻址跳转(jmp)。
但严格的说,程序运行效率不止包含运行速度一方面,还有内存消耗也是很重要的方面。可见case分支过多虽不会影响运行速度,但会增大辅助内存的用量。
#13
1.将case后处理封装为函数,如LS的Anyidan所言----可以使switch/case结构清晰
2.按case的常量性质调整顺序:
a:如果是1,2,3或a,b,c之类的,按序排列,且不要省略(即使不用也不省)----可读性好
b:如果是用宏名字或枚举常量之类的,按意群排列----可读性好
3.当代码内容稳定后再考虑用跳转表固化因果关系
2.按case的常量性质调整顺序:
a:如果是1,2,3或a,b,c之类的,按序排列,且不要省略(即使不用也不省)----可读性好
b:如果是用宏名字或枚举常量之类的,按意群排列----可读性好
3.当代码内容稳定后再考虑用跳转表固化因果关系
#14
把 case 值与响应函数封装到表里,循环查表吧。
#15
编译器对switch case的优化只比自己hash funptr[]稍逊。
#16
学习了
#17
对啊,枚举呗
#18
如果是C++的话,可以使用继承,重载等.(个人意见)
#19
看你怎么用了。
枚举 数组 有的时候更有用
枚举 数组 有的时候更有用
#20
学习了,帮顶一下吧
正如楼上多位所言
如果case分支处理比较整齐一致,可以利用函数来使代码整洁
如果可以用函数数组来处理,那是再好不过了
正如楼上多位所言
如果case分支处理比较整齐一致,可以利用函数来使代码整洁
如果可以用函数数组来处理,那是再好不过了
#21
感谢大家的回复,觉得枚举和表驱动法应该可行,我还要去多多学习~
#22
switch-case的优化可是很犀利的,不同的情况用不同的优化,优化后速度大大增加
#1
没有万能的改进方法,需具体问题具体分析,上代码。
#2
要精简case,那么你的算法就做到最优。
#3
有些时候,确实没办法。。。
#4
case的情况归类,然后switch类,再掉具体类的函数,函数里面小switch。
#5
额 不用!
#6
用 enum 定义 case 数值
将每一个 case 的处理写成单独的函数
加注释
将每一个 case 的处理写成单独的函数
加注释
#7
楼主的困难有2个方面
1,case分支太多,程序可读性变差
2,case分支太多,影响了程序的执行效率
如果是第1条,属于友好编码的范畴
如果是第2条,则是必须要解决的
对于这种问题,可以考虑采用 表驱动法
楼主不妨把具体的需求说一下,然后可以制定一个合适的 表驱动法 来解决
1,case分支太多,程序可读性变差
2,case分支太多,影响了程序的执行效率
如果是第1条,属于友好编码的范畴
如果是第2条,则是必须要解决的
对于这种问题,可以考虑采用 表驱动法
楼主不妨把具体的需求说一下,然后可以制定一个合适的 表驱动法 来解决
#8
C99 标准支持 case一个范围 比如 case 'A' ... 'Z': 楼主可以看看
#9
看你自己的需求。。这个一般不能改进。。。
#10
case太多,圈复杂度也太高
case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。
case 不会随着多少而增加执行的效率,具体你去看生成后的汇编。
#11
我直觉上认为case的分支多了,的确会影响执行效率
请问10楼,生成后的汇编怎么证明case分支的多少与执行效率无关的?
请教了
#12
我想10L所说的执行效率应该是指运行速度吧。
switch-case结构的实现原理是向量表。编译程序会为每一个switch-case结构分配一个向量表,表元的大小为址长度(以32位系统为例就是4Byte),现假设向量表首地址为A。
case 0:后面的代码首地址存入A;
case 1:后面的代码首地址存入A+4;
case 2:后面的代码首地址存入A+8,照此类推。
不管case分支有多少,switch-case结构在运行时都只执行了两个指令:加法(add)和寻址跳转(jmp)。
但严格的说,程序运行效率不止包含运行速度一方面,还有内存消耗也是很重要的方面。可见case分支过多虽不会影响运行速度,但会增大辅助内存的用量。
#13
1.将case后处理封装为函数,如LS的Anyidan所言----可以使switch/case结构清晰
2.按case的常量性质调整顺序:
a:如果是1,2,3或a,b,c之类的,按序排列,且不要省略(即使不用也不省)----可读性好
b:如果是用宏名字或枚举常量之类的,按意群排列----可读性好
3.当代码内容稳定后再考虑用跳转表固化因果关系
2.按case的常量性质调整顺序:
a:如果是1,2,3或a,b,c之类的,按序排列,且不要省略(即使不用也不省)----可读性好
b:如果是用宏名字或枚举常量之类的,按意群排列----可读性好
3.当代码内容稳定后再考虑用跳转表固化因果关系
#14
把 case 值与响应函数封装到表里,循环查表吧。
#15
编译器对switch case的优化只比自己hash funptr[]稍逊。
#16
学习了
#17
对啊,枚举呗
#18
如果是C++的话,可以使用继承,重载等.(个人意见)
#19
看你怎么用了。
枚举 数组 有的时候更有用
枚举 数组 有的时候更有用
#20
学习了,帮顶一下吧
正如楼上多位所言
如果case分支处理比较整齐一致,可以利用函数来使代码整洁
如果可以用函数数组来处理,那是再好不过了
正如楼上多位所言
如果case分支处理比较整齐一致,可以利用函数来使代码整洁
如果可以用函数数组来处理,那是再好不过了
#21
感谢大家的回复,觉得枚举和表驱动法应该可行,我还要去多多学习~
#22
switch-case的优化可是很犀利的,不同的情况用不同的优化,优化后速度大大增加