百科问答小站 logo
百科问答小站 font logo



代码里充斥着 if-else 分支有什么不好吗?除了可维护性,对程序运行效率有什么影响吗? 第1页

  

user avatar   pansz 网友的相关建议: 
      

if else 会一定程度影响性能,在大量循环的情况下,它的性能会略微低一点,因为分支预测的关系。但其实,大多数情况下我们不用过早的进行性能优化[1]。毕竟,通常只需要优化用profiler测定出来的性能瓶颈,其他地方的代码不需要。

至于可维护性?具体情况具体分析。

先考虑一下,实际工程中,如果你需要维护一个屎山级别的项目,你最害怕的是什么问题?

你最害怕的是:当你改一个地方的时候,会莫名其妙的影响某个不知道为什么会被牵连的地方。无论怎么改都会导致其它bug,最后无从下手。

所以实际情况是:代码越少复用,越少耦合,越少条件判断,越容易成为一份容易维护的代码。

至于最初面对的问题:改一个功能需要改多处代码,现在反而不是问题,因为现在编辑器的查找替换功能都非常强大,把所有使用的地方搜索出来,逐一修改即可。

你当年以为把一处代码提出来让多个模块公用,是一个好主意,十年后,这可能就会成为一个定时炸弹。

你可能以为老工程师喜欢把一份代码复制来复制去是一个很糟糕的行为,然而实际上,代码刚复制的时候看起来是一样,软件经过几十个版本的迭代,每一份代码就可能全变成不一样的,有经验的工程师一开始就预测了他们未来将会变成不一样。所以一开始就不让他们共享同一份代码。

那么反过来呢?如果你一开始就试图让多个地方公用同一份代码,结局就是:每当我们需要改一个地方的时候就会加一个if else,因为需要改的只有一处,你多个地方共用了同一份代码,导致为了改这一处使用场合,必须加个条件判断限定到某个特定场合。在未来,这种不恰当复用导致的增加耦合,会逐渐成长为不可维护的灾难。

所以 if else 究竟会不会影响维护?我认为是这样:

  • 如果 if else 这个逻辑是算法的一部分,是原本设计如此,那么它就没有问题。
  • 如果这个 if else 是在一次一次的需求变更,代码功能迭代中逐步加进去的,那么这个 if else 就是坑。

参考

  1. ^Donard Knuth: The Art of Computer Programming https://stackify.com/premature-optimization-evil/#:~:text=Premature%20optimization%20is%20spending%20a%20lot%20of%20time,from%20his%20book%20The%20Art%20of%20Computer%20Programming%3A

user avatar   levelpp_edu 网友的相关建议: 
      

其它答主说的很好,但是是从“分支预测”与“CPU流水线”角度讲的,漏了很基本的一环:

C语言实践中,用switch-case代替if-else可以获得相当可观的性能提升。

例如某些涉及词法分析的程序中,有类似这样的逻辑:

       // 仅展示程序结构 if (c==',') { } else if (c=='.') { } else if (c==';') { } else if (c=='!') { } else if (c=='[') { } else if (c==']') { }     

当分析一个较大的源代码文件时,会发现if判断执行了很多次,是一个开销热点。而这里想要优化也十分容易,改为:

       // 仅展示程序结构 switch (c) {     case ',':     { break;}     case '.':     { break;}     case ';':     { break;}     case '!':     { break;}     case '[':     { break;}     case ']':     { break;} }     

改为这样以后进行性能测试,会发现显著的性能提升。

这也是C语言中switch-case的意义所在。


以上两种写法,性能有差异的原因也很简单:在if-else判断中,假如遇到了字符']',要进行6次判断,前5次的 , . ; ! [ 都不相等时,才会跳到第6种情况。

而switch-case就可以直接跳转到case ']'的情况,少了很多步判断,在分析较大的文件时优化效果立竿见影。

通过if-else与switch-case的对比,可以加深对if-else优缺点的了解。


这里要追根究底的话,还有一个问题:C语言编译器如何实现一个快速的switch-case结构?

这个要展开的话,又是一个新的话题了。有兴趣的读者可以参考:

1、C语言中switch-case是怎么如何的?

2、C语言中switch 的查找实现原理


user avatar   chengxumiao 网友的相关建议: 
      

技术上:光刻机的制造和使用工艺。

金融上:打破美元的霸权。

军事上:台湾问题。


别的问题(房产绑架经济、老龄化、东西部平衡等)都是发展中的问题,都是可能通过发展来解决的。

上面列的3个问题是当前面临的核心问题。




  

相关话题

  怎样算是「风骚」的代码? 
  这个代码int函数无返回值且开-O2,for循环会无限循环,是什么原因? 
  如果有两颗药丸,一颗吃了让你写代码100%不出错,另一颗吃了能让你100%发现并修改bug,选哪颗? 
  项目组里的代码审查员要我把代码写的很啰嗦,怎么办? 
  写代码应该本着什么原则,才能写出优秀的代码? 
  世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例? 
  忽然发现自己敲键盘的指法很不标准,我觉得已经对 coding 效率产生影响,怎么办? 
  如何看待网传美团王兴怼宝马 X5 研发技术和特斯拉比差距大?代码行多少能代表研发水平高低吗? 
  台湾一公司停电后程序员用纸笔手写代码,作为一名程序员,你有过哪些神奇的工作经历? 
  为什么信息竞赛题题解较多使用缩写、魔数、宏定义? 

前一个讨论
张学友为什么可以这么密集地在各个地方开演唱会?为什么要这么卖命地开演唱会呢?
下一个讨论
特斯拉底层控制系统是linux,作为一款分时操作系统特斯拉怎么保证控制系统实时性的?





© 2024-11-09 - tinynew.org. All Rights Reserved.
© 2024-11-09 - tinynew.org. 保留所有权利