我的好友说,为了效率,他试图用尽可能少的if / else语句进行编程。当我问他为什么说如果/其他人占用该计划资源的一些重要部分时,他会试图远离他们。
他是对的吗?有没有更好的方法来执行if / else样式代码而不实际使用该结构?开关/箱体结构是否更好?
编辑:他不是指特定的语言,而是更多的一般做法。以及UNIX / Linux和Windows平台。答案 0 :(得分:6)
通常,编译器将if / then / else构造表示为测试,然后跳转到代码中的另一个位置。对于任何处理器而言,这都是非常标准且经过优化的操作。除非您使用标准编译或解释语言以外的其他方式进行编程,否则您的好友的结论存在严重缺陷。
此外,优化此级别的代码而不首先对其进行分析(找到慢位的位置)是不明智的。 (更像是完全浪费程序员的时间。)
答案 1 :(得分:4)
switch / case语句与具有所有现代优化编译器的语句具有相同的速度。
你的好友正在写意大利面条代码。
答案 2 :(得分:2)
如果语句相对于switch / case确实很慢。以下是SO的一个很好的解释:If vs. Switch Speed
这是一篇有趣的文章,从C#角度进入一些细节:http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/
也就是说,根据您编写的程序类型,可能还需要考虑其他因素,例如算法设计或所需的I / O数量或网络流量,这些因素会对性能。除非那些有条件的陈述被称为有时候的bazillions,否则你可能会有更大的收益来编写干净,可读的代码,并专注于具有更可衡量的性能影响的问题。
祝你好运!答案 3 :(得分:2)
正如许多人所指出的,大多数现代(C / C ++)编译器都能以最佳方式处理这个问题。您可能对此链接感兴趣 http://www.eventhelix.com/realtimemantra/basics/optimizingcandcppcode.htm#Break大型交换机语句到嵌套交换机
在如何使用switch语句上添加了几点。
答案 4 :(得分:2)
现代应用可以包含数千行代码。 该代码充满了对数据库例程,数据结构库函数,文件I / O,套接字I / O,窗口函数等的调用等。
因此,在运行该代码时,如果你拍摄了一堆状态的快照,那么在应用程序员没有编写的某个函数中几乎总是。 程序计数器在程序员自己的代码中占10%,1%甚至更少的时间是非常典型的。
因此,应用程序代码中保存循环的任何优化(循环在那里)只与程序计数器在该代码中的时间部分有关 - 在这种类型的代码中很少甚至很少
因此,如果switch语句有足够的分支可以节省几个周期,那么有一种透视感是有用的。
答案 5 :(得分:1)
当一个查找表是更好的选择时,一个草率的程序员可能会编写严重依赖于几个类似条件的代码。故事的道德:避免不必要的分支(虽然这应该是显而易见的)。
由于分支导致的减速通常是由指令流水线停滞造成的,尽管这种减速的严重程度取决于架构。