JS编程建议——24:优化if逻辑(1)

建议24:优化if逻辑(1)
逻辑顺序体现了人的思维的条理性和严密性。合理的顺序可以提升解决问题的品质,相反,混乱的顺序很容易导致各种错误的发生。在分支结构中经常需要面临各种优化逻辑顺序的问题。
人在思考问题时,一般总会对各种最可能发生的情况做好准备,这叫做“有备而来”。分支结构中各种条件根据情况的先后、轻重来排定顺序。如果把最可能的条件放在前面,把最不可能的条件放在后面,这样程序在执行时总会按照代码先后顺序逐一检测所有条件,直到发现匹配的条件时才停止继续检测。如果把最可能的条件放在前面,就等于降低了程序的检测次数,自然也就提升了分支结构的执行效率,避免空转,这在大批量数据检测中效果非常明显。例如,对于一个论坛系统来说,普通会员的数量要远远大于版主和管理员的数量。换句话说,大部分登录的用户都是普通会员,如果把普通会员的检测放在分支结构的前面,就会减少计算机检测的次数。
if优化目标:最小化找到正确分支之前所判断条件体的数量。if优化方法:将最常见的条件体放在首位。例如:

  1. if(value < 5) {
  2. //do something
  3. } else if(value > 5 && value < 10) {
  4. //do something
  5. } else {
  6. //do something
  7. }
    这段代码只有在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;
  23. }
    在这个if结构中,所计算的条件体的最大数目是10。如果假设value 的值在0~10 之间均匀分布,那么会增加平均运行时间。为了减少条件判断的数量,可重写为一系列嵌套结构,例如:
  24. if(value < 6) {
  25. if(value < 3) {
  26. if(value == 0) {
  27. return result0;
  28. } else if(value == 1) {
  29. return result1;
  30. } else {
  31. return result2;
  32. }
  33. } else {
  34. if(value == 3) {
  35. return result3;
  36. } else if(value == 4) {
  37. return result4;
  38. } else {
  39. return result5;
  40. }
  41. }
  42. } else {
  43. if(value < 8) {
  44. if(value == 6) {
  45. return result6;
  46. } else {
  47. return result7;
  48. }
  49. } else {
  50. if(value == 8) {
  51. return result8;
  52. } else if(value == 9) {
  53. return result9;
  54. } else {
  55. return result10;
  56. }
  57. }
  58. }
时间: 2024-10-23 05:01:21

JS编程建议——24:优化if逻辑(1)的相关文章

JS编程建议——24:优化if逻辑(2)

建议24:优化if逻辑(2)重写if结构后,每次抵达正确分支时最多通过4个条件判断.新的if结构使用二分搜索法将值域分成了一系列区间,然后逐步缩小范围.当数值范围分布在0-10 时,此代码的平均运行时间大约是前面代码的一半.此方法适用于需要测试大量数值的情况,而相对离散值来说switch 更合适.当然,在性能影响不是很大的情况下,遵循条件检测的自然顺序会更容易阅读.例如,对于检测周一到周五值日任务安排的分支结构来说,虽然周五的任务比较重要,但是这类任务有着明显的顺序,安排顺序结构还是遵循它的自然

JS编程建议——13:养成优化表达式的思维方式(1)

建议13:养成优化表达式的思维方式(1)对同一个表达式稍加改动就会打乱表达式的逻辑运算顺序,因此我们应该学会优化表达式的结构,不改变表达式的运算顺序和结果即可提高代码的可读性.1.第一种方式--加小括号例如,面对下面这个复杂表达式,可能被&&和||的优先级所迷惑. (a + b > c && a – b < c || a > b > c) 不过,如果进行如下优化,逻辑运算的顺序就会非常清晰了. ((a + b > c) && (

JS编程建议——33:优化循环结构

建议33:优化循环结构循环是最浪费资源的一种流程.循环结构中一点小小的损耗都会被成倍放大,从而影响程序运行的效率.下面从以下几个方面介绍如何优化循环结构,从而提高循环结构的执行效率.(1)优化结构循环结构常常与分支结构混用在一起,因此如何嵌套就非常讲究了.例如,设计一个循环结构,结构内的循环语句只有在特定条件下才被执行.使用一个简单的例子来演示,其正常思维结构如下: var a = true; for(var b = 1; b < 10; b ++ ) { // 循环结构 if(a == tru

JS编程建议——8:谨慎使用运算符(1)

建议8:谨慎使用运算符(1)1.用===,而不用==JavaScript有两组相等运算符:===和!==.==和!=.===和!==这一组运算符会按照期望的方式工作.如果两个运算数类型一致且拥有相同的值,那么===返回true,而!==返回false.==和!=只有在两个运算数类型一致时才会做出正确的判断,如果两个运算数是不同的类型,会试图强制转换运算数的类型.转换的规则复杂且难以记忆,具体规则如下: '' == '0' // false 0 == '' // true 0 == '0' //

JS编程建议——25:恰当选用if和switch

建议25:恰当选用if和switchswitch结构中存在很多限制,存在这些限制的主要目的是提高多重分支结构的执行效率.因此,如果能够使用switch结构,就不要选择if结构.无论是使用if结构,还是使用switch结构,应该确保下面3个目标的基本实现:准确表现事物内在的.固有的逻辑关系.不能为了结构而破坏事物的逻辑关系.优化逻辑的执行效率.执行效率是程序设计的重要目标,不能为了省事而随意耗费资源.简化代码的结构层次,使代码更方便阅读.相对来说,下面几种情况更适合使用switch结构:枚举表达式

JS编程建议——65:比较函数的惰性求值与非惰性求值

建议65:比较函数的惰性求值与非惰性求值在JavaScript中,使用函数式风格编程时,应该对于表达式有着深刻的理解,并能够主动使用表达式的连续运算来组织代码.1)在运算元中,除了JavaScript默认的数据类型外,函数也作为一个重要的运算元参与运算.2)在运算符中,除了JavaScript的大量预定义运算符外,函数还作为一个重要的运算符进行计算和组织代码.函数作为运算符参与运算,具有非惰性求值特性.非惰性求值行为自然会对整个程序产生一定的负面影响.先看下面这个示例:var a = 2;fun

JS编程建议——2:正确辨析JavaScript句法中的词、句和段

建议2:正确辨析JavaScript句法中的词.句和段JavaScript语法包含了合法的JavaScript代码的所有规则和特征,它主要分为词法和句法.词法包括字符编码.名词规则.特殊词规则等.词法侧重语言的底层实现(如语言编码问题等),以及基本规则的定义(如标识符.关键字.注释等).它们都不是最小的语义单位,却是构成语义单位的组成要素.例如,规范字符编码集合.命名规则.标识符.关键字.注释规则.特殊字符用法等.句法定义了语言的逻辑和结构,包括词.句和段的语法特性,其中段体现逻辑的结构,句表达

JS编程建议——3:减少全局变量污染

建议3:减少全局变量污染定义全局变量有3种方式:在任何函数外面直接执行var语句. var f = 'value'; 直接添加一个属性到全局对象上.全局对象是所有全局变量的容器.在Web浏览器中,全局对象名为window. window.f = 'value'; 直接使用未经声明的变量,以这种方式定义的全局变量被称为隐式的全局变量. f = 'value'; 为方便初学者在使用前无须声明变量而有意设计了隐式的全局变量,然而不幸的是忘记声明变量成了一个非常普遍的现象.JavaScript的策略是让

JS编程建议——5:防止JavaScript自动插入分号

建议5:防止JavaScript自动插入分号JavaScript语言有一个机制:在解析时,能够在一句话后面自动插入一个分号,用来修改语句末尾遗漏的分号分隔符.然而,由于这个自动插入的分号与JavaScript语言的另一个机制发生了冲突,即所有空格符都被忽略,因此程序可以利用空格格式化代码.这两种机制的冲突,很容易掩盖更为严重的解析错误.有时会不合时宜地插入分号.例如,在return语句中自动插入分号将会导致这样的后果:如果return语句要返回一个值,这个值的表达式的开始部分必须和return在