0 Comments

优化if逻辑(1)

发布于:2012-11-30  |   作者:广州网站建设  |   已聚集:人围观

逻辑顺序体现了人的思维的条理性和严密性。合理的顺序可以提升解决问题的品质,相反,混乱的顺序很容易导致各种错误的发生。在分支结构中经常需要面临各种优化逻辑顺序的问题。

人在思考问题时,一般总会对各种最可能发生的情况做好准备,这叫做“有备而来”。分支结构中各种条件根据情况的先后、轻重来排定顺序。如果把最可能的条件放在前面,把最不可能的条件放在后面,这样程序在执行时总会按照代码先后顺序逐一检测所有条件,直到发现匹配的条件时才停止继续检测。如果把最可能的条件放在前面,就等于降低了程序的检测次数,自然也就提升了分支结构的执行效率,避免空转,这在大批量数据检测中效果非常明显。例如,对于一个论坛系统来说,普通会员的数量要远远大于版主和管理员的数量。换句话说,大部分登录的用户都是普通会员,如果把普通会员的检测放在分支结构的前面,就会减少计算机检测的次数。广州网站建设

if优化目标:最小化找到正确分支之前所判断条件体的数量。if优化方法:将最常见的条件体放在首位。例如:


  1. if(value < 5) {  
  2.     //do something  
  3. } else if(value > 5 && value < 10) {  
  4.     //do something  
  5. } else {  
  6.     //do something  

这段代码只有在value 值经常小于5 时才是最优的。如果value 经常大于或等于10,那么在进入正确分支之前,必须两次运算条件体,导致表达式的平均运行时间增加。if中的条件体应当总是按照从最大概率到最小概率的顺序排列,以保证理论运行速度最快。

另外一种减少条件判断数量的方法:将if编写成一系列嵌套结构。使用一个单独的一长串的if结构通常导致运行缓慢,因为每个条件体都要被计算,例如:


  1. if(value == 0) {  
  2.     return result0;  
  3. } else if(value == 1) {  
  4.     return result1;  
  5. } else if(value == 2) {  
  6.     return result2;  
  7. } else if(value == 3) {  
  8.     return result3;  
  9. } else if(value == 4) {  
  10.     return result4;  
  11. } else if(value == 5) {  
  12.     return result5;  
  13. } else if(value == 6) {  
  14.     return result6;  
  15. } else if(value == 7) {  
  16.     return result7;  
  17. } else if(value == 8) {  
  18.     return result8;  
  19. } else if(value == 9) {  
  20.     return result9;  
  21. } else {  
  22.     return result10;  

 

在这个if结构中,所计算的条件体的最大数目是10。如果假设value 的值在0~10 之间均匀分布,那么会增加平均运行时间。为了减少条件判断的数量,可重写为一系列嵌套结构,例如:

  1. if(value < 6) {  
  2.     if(value < 3) {  
  3.         if(value == 0) {  
  4.             return result0;  
  5.         } else if(value == 1) {  
  6.             return result1;  
  7.         } else {  
  8.             return result2;  
  9.         }  
  10.     } else {  
  11.         if(value == 3) {  
  12.             return result3;  
  13.         } else if(value == 4) {  
  14.             return result4;  
  15.         } else {  
  16.             return result5;  
  17.         }  
  18.     }  
  19. } else {  
  20.     if(value < 8) {  
  21.         if(value == 6) {  
  22.             return result6;  
  23.         } else {  
  24.             return result7;  
  25.         }  
  26.     } else {  
  27.         if(value == 8) {  
  28.             return result8;  
  29.         } else if(value == 9) {  
  30.             return result9;  
  31.         } else {  
  32.             return result10;  
  33.         }  
  34.     }  
飞机