if 语句的优化

转载 2007年09月14日 21:17:00

if语句很简单,相信大家都会,但是确有很多值得注意的。 首先来说一下code style的问题。

=========不好的风格===========
if( (x +4-y * 25) > 10 || y > 1023 || GetSomething())
{
   ....
}

=========好的风格============
if( (x +4-y * 25) > 10 
    || y > 1023 
    || GetSomething() )
{
   ....
}
相信大家能看出来第2段代码的时候要比第1段代码容易读的多。

if 语句虽然简单,但是涉及到CPU的branch prediction的问题。简单的说, 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有一种技术叫做binary branch,举个简单的例子,代码如下:

int x;
if( x == 1)
{

}
else if( x == 2)
{

}
else if( x == 3)
{

}
else if( x == 4)
{

}
对付这段代码,可以用switch来解决,也可以用binary branch,修改后的代码如下:
if( x <= 2)
{
     if( x == 1)
     {...}
     else
     {...}
}
else
{
     if( x == 3)
     {...}
     else
     {...}
}
如果判断的情况复杂一点,编译器就没有优化的能力,需要考大家自己动手啦。

文章出处:http://data.gameres.com/document.asp?TopicID=65440

 

if-else优化措施

条件表达式通常有两种表现形式,第一种:所有分支都是属于正常行为;第二种:条件表达式提供的答案只有一种是正常行为。其他都是不常见的情况。如果两条分支都是正常行为,就应该使用if~else的条件表达式;如...
  • heqiuya
  • heqiuya
  • 2012年07月28日 13:40
  • 4233

java中if暗含的性能优化玄机

我们知道的if()括号内就是填写判断条件的。那到底这个判断条件会暗含什么玄机呢?   首先,让大家看一个很简单的程序,代码如下: public class Main { public stati...

你会优化你程序中的if语句吗?

假设要你做一个猜数字的游戏,你猜大了会提示你大了,猜小了会提示你小了,刚好就答对,那么你是不是会觉得很简单,然后就写出了if(Price>beguess){    printf("sobig!/n")...

if语句的优化

  • 2017年07月26日 16:12
  • 1KB
  • 下载

php优化if多重嵌套语句

在做公司erp系统的过程中,遇到了一个需求。 需要读取数据库内不同的表格,并对其表A的字段,与表B的字段进行判断。 会用到多个判断语句。而本人在编写时由于没想太多大部分用的都是if判断语句来筛选。...

C编译器剖析_5.3.1 中间代码生成及优化_If语句和复合语句的翻译

5.3.1   If语句和复合语句的翻译     我们先简单回顾一下对布尔表达式的翻译,我们通过调用TranslateBranch函数来产生跳转指令,从而实现布尔表达式的语义。在使用函数Transl...
  • SheIsC
  • SheIsC
  • 2015年04月20日 15:48
  • 785

if else 语句

  • 2017年08月07日 13:19
  • 5KB
  • 下载

Shell编程-流程控制-if语句

  • 2014年08月21日 14:50
  • 575KB
  • 下载

Mysql数据库If语句的使用

MySQL的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF表达式 [sql] view plain copy ...

Swift视频教程:控制流 条件语句-if

  • 2015年08月26日 15:57
  • 42.8MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:if 语句的优化
举报原因:
原因补充:

(最多只允许输入30个字)