if语句很简单,相信大家都会,但是确有很多值得注意的。首先来说一下codestyle的问题。
=========不好的风格===========
if((x+4-y*25)>10||y>1023||GetSomething())
{
....
}
=========好的风格============
if((x+4-y*25)>10
||y>1023
||GetSomething())
{
....
}
相信大家能看出来第2段代码的时候要比第1段代码容易读的多。
if 语句虽然简单,但是涉及到CPU的branchprediction的问题。简单的说,CPU有个指令缓存,会预先把一部分代码读到缓存中等待稍后执 行。当CPU遇到if语句的时候,会把条件判断为true的那段代码读到缓存中,然后对if(条件判断)中的条件判断语句进行运算。如果运算结果是 false,那么CPU就会重新从内存中载入false的代码,在这期间大部分CPU时间会被浪费点。
所以在写if语句的时候,一定要把最容易成立的条件放在最前面进行判断。比如:
======错误的写法=======
if((float)rand()/RAND_MAX<0.2)//只有20%的可能运行if部分
{
//被读入到指令缓存的部分。
}
======正确的写法=======
if((float)rand()/RAND_MAX>0.2)//有80%的可能运行if部分。
{
//被读入到指令缓存的部分。
}
if语句另外一个需要注意的地方是在进行多重条件判断的时候,要安排好顺序。比如:
if((float)rand()/RAND_MAX<0.4
&&(float)rand()/RAND_MAX<0.3
&&(float)rand()/RAND_MAX<0.2)
{
......
}
根据C语言的规则(这点不同于Pascal),如果第一个条件(rand()/RAND_MAX<0.4)不成立,那么就不会运行第2和第3个条件,而直接跳转。所以应该把最难成立的条件放在第一的位置上,正确的代码为:
if((float)rand()/RAND_MAX<0.2//只有%20的可能
&&(float)rand()/RAND_MAX<0.3
&&(float)rand()/RAND_MAX<0.4)
{
......
}
由于编译器并无法计算和统计每种条件成立的可能性,只能靠大家手动的调整来提高代码的效率。
最后是if有一种技术叫做binarybranch,举个简单的例子,代码如下:
intx;
if(x==1)
{
}
elseif(x==2)
{
}
elseif(x==3)
{
}
elseif(x==4)
{
}
对付这段代码,可以用switch来解决,也可以用binarybranch,修改后的代码如下:
if(x<=2)
{
if(x==1)
{...}
else
{...}
}
else
{
if(x==3)
{...}
else
{...}
}
如果判断的情况复杂一点,编译器就没有优化的能力,需要考大家自己动手啦。
文章出处:http://data.gameres.com/document.asp?TopicID=65440
分享到:
相关推荐
if语句的优化
UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法。尽管我还没使用它去做一些尝试性的测试,但从这里可以看到它的确对js作了美化的工作。也许有人认为if语句就...
UglifyJS是一个对javascript进行压缩和美化的工具,在它的文档说明中,我看到了几种关于if语句优化的方法。
js中if语句的几种优化代码写法.docx
用if-else语句来优化奇数偶数的判定代码,具体请参考苹果开发者Mike的博文 http://blog.sina.com.cn/s/blog_7aa21f320100r4zq.html
通过在quartus中仿真并分析综合后的RTL图,分析了多个else_if级联对综合结果的影响,说明了为什么我们要避免...提出了解决办法,包括使用多个if_else来代替else_if的多级级联,还有用casex语句来代替多个esle_if级联。
if条件满足,代码却不执行,好奇怪!
本篇文章给python初学者总结了关于Python之if语句的相关用法以及知识点总结,跟着学习下吧。
JavaScript中条件语句的优化技巧总结 对多个条件使用 Array.includes function test(fruit) { if (fruit == 'apple' || fruit == 'strawberry') { console.log('red'); } } 上面的例子看起来不错。然而,...
内容涵盖了switch语句的定义、基本语法、使用场景、优点、注意事项、与if语句的区别、实战应用、多重分支、范围检查、字符串处理、默认情况、性能考虑、灵活性、多态性、安全性、调试、性能优化和最佳实践等高级知识...
动态SQL可以让开发者构建更灵活、高效的数据库操作语句,因为他们可以根据实际需要创建出更加精确和优化的SQL语句。Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常...
动态SQL可以让开发者构建更灵活、高效的数据库操作语句,因为他们可以根据实际需要创建出更加精确和优化的SQL语句。Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常...
动态SQL可以让开发者构建更灵活、高效的数据库操作语句,因为他们可以根据实际需要创建出更加精确和优化的SQL语句。Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常...
数组与指针语句具有十分紧密的关系,一般来说,指针比较灵活简洁,而数组则比较直观,容易理解。对于大部分的编译器,使用指针比使用数组生成的代码更短,执行效率更高。但是在Keil中则相反,使用数组比使用的指针...
动态SQL可以让开发者构建更灵活、高效的数据库操作语句,因为他们可以根据实际需要创建出更加精确和优化的SQL语句。Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常...
动态SQL可以让开发者构建更灵活、高效的数据库操作语句,因为他们可以根据实际需要创建出更加精确和优化的SQL语句。Mabits的动态SQL还允许开发者使用参数化查询,可以防止SQL注入攻击,并增强程序的安全性 学习经常...
牛顿约束优化方法源程序代码 程序各语句含有相关注释 function [x,minf]=minnt(f,x0,var,eps) format long;%format:设置输出格式 format long、short不影响变量的显示 if nargin==3 eps=1.0e-6; end。
主要介绍了如何优雅的替换掉Java代码中的if else,帮助大家优化自己的Java代码,提高可读性与简洁性,感兴趣的朋友可以了解下