What is the impact (performance wise) of an “if” statement
我的朋友说为了效率,他尽量少用if/else语句编程。当我问他为什么说"如果/其他"占用了项目资源的一部分时,他试图避开它们。
他说得对吗?是否有更好的方法来执行if/else样式的代码而不实际使用该结构?开关/外壳结构是否更好?
编辑:他不是指一种特定的语言,而是指一种普遍的实践。以及Unix/Linux和Windows平台。
通常,编译器将把if/then/else构造表示为一个测试,然后跳转到代码中的另一个位置。对于任何处理器来说,这都是一个非常标准和优化的操作。除非你不是用标准编译或解释语言编程,否则你的伙伴的结论是有严重缺陷的。
此外,在这一级别优化代码而不首先对其进行分析(以找出慢位的位置)是很好的,不明智的。(更像是完全浪费了程序员的时间。)
switch/case语句与所有现代优化编译器的if语句具有相同的速度。
你的朋友正在写意大利面代码。
现代应用程序可以包含数千行代码。该代码充满了对数据库例程、数据结构库函数、文件I/O、套接字I/O、窗口功能等的调用。
因此,在运行代码时,如果您对它的状态进行一系列快照,那么它几乎总是处于应用程序程序员没有编写的某个函数中。程序计数器在程序员自己的代码中占10%、1%甚至更少的时间是很典型的。
因此,应用程序代码中的任何优化,在这里保存一个循环,在那里保存一个循环,只在程序计数器在该代码中所占的时间的一小部分——在这种类型的代码中很少,甚至很少。
因此,如果switch语句具有足够的分支,那么它可能会节省几个周期,但是有一种透视感是很有用的。
正如许多人指出的,大多数现代(C/C++)编译器都处理得很好。您可能对这个链接感兴趣http://www.eventhix.com/realtimemantra/basics/optimizingcandcpcpccode.htm将大交换机语句分解为嵌套交换机
在如何使用switch语句上增加了一些要点。
相对于switch/case,if语句确实可以变慢。这里有一个很好的解释:如果与开关速度
以下是一篇有趣的文章,从C的角度探讨了一些细节:http://igoro.com/archive/fast-and-slow-if-statements-branch-prediction-in-modern-processors/
也就是说,根据您编写的程序的类型,可能还需要考虑其他因素,例如算法设计或所需的I/O量或网络流量,这些因素将对性能产生更大的影响。除非这些条件语句被称为无数次,否则编写干净、易读的代码,并关注具有更可度量的性能影响的问题可能会有更大的回报。
祝你好运!
当查找表是更好的选择时,一个草率的程序员可能会编写严重依赖于几个类似条件的代码。故事的寓意:避免不必要的分支(尽管这应该是显而易见的)。
由于分支而导致的速度减慢通常是由指令管道暂停引起的,尽管这种速度减慢的严重性取决于体系结构。