JS编程建议——28:使用查表法提高条件检测的性能

建议28:使用查表法提高条件检测的性能
当有大量离散值需要测试时,使用if和switch都比使用查表法要慢得多。在JavaScript中查表法可通过数组或普通对象实现,查表法访问数据比if和switch更快,特别是当条件体的数目很大时。与if和switch相比,查表法不仅非常快,而且当需要测试的离散值数量非常大时,也有助于保持代码的可读性。
例如,在下面代码中,使用switch检测value值。

  1. switch(value) {
  2. case 0:
  3. return result0;
  4. case 1:
  5. return result1;
  6. case 2:
  7. return result2;
  8. case 3:
  9. return result3;
  10. case 4:
  11. return result4;
  12. case 5:
  13. return result5;
  14. case 6:
  15. return result6;
  16. case 7:
  17. return result7;
  18. case 8:
  19. return result8;
  20. case 9:
  21. return result9;
  22. default:
  23. return result10;
  24. }
    使用switch结构检测value值的代码所占的空间可能与switch的重要性不成比例,代码很笨重。整个结构可以用一个数组查询替代:
  25. var results = [result0, result1, result2, result3,
    result4, result5, result6, result7, result8, result9, result10]
  26. return results[value];
    当使用查表法时,必须完全消除所有条件判断。操作转换成一个数组项查询或一个对象成员查询。使用查表法的一个主要优点:由于没有条件判断,当候选值数量增加时,基本上不会增加额外的性能开销。查表法常用于一个键和一个值形成逻辑映射的领域,而switch更适合于每个键需要一个独特的动作或一系列动作的场合。
时间: 2024-10-14 04:10:20

JS编程建议——28:使用查表法提高条件检测的性能的相关文章

C#,Java,C -循环冗余检验:CRC-16-CCITT查表法

C#代码 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace TestCRC 7 { 8 /// <summary> 9 /// 循环冗余检验:CRC-16-CCITT查表法 10 /// </summary> 11 public static partial class CRCITU 12 { 13 /// <s

半字节查表法提问-求教CRC半字节查表法原理和表的生成算法

问题描述 求教CRC半字节查表法原理和表的生成算法 如题 正在研究CRC16的半字节查表法,请各位大神前辈指点下这个的原理和表生成的算法

嵌入式C语言查表法的项目应用

嵌入式C实战项目开发技巧:如何对一个有规律的数组表进行位移操作 就像下面的这个表 之前写过上面这个标题的一篇文章,讲的是以位移的方式去遍历表中的数据,效率非常高,但是,如果要实现一个乱序的流水灯或者跑马灯的话,思考一个这样的算法是不可取的,很费时间,也很费脑力,于是,今天就说一说查表法,如果在程序中运用查表法,不论多么复杂的程序,只要符合一张表,那都可以实现,非常简单,体力活而已,接下来看看下面这个程序,对上面这个进行操作吧. #include <stdio.h> #include <w

JS编程建议——21:推荐提高循环性能的策略(1)

建议21:推荐提高循环性能的策略(1)每次运行循环体时都会产生性能开销,增加总的运行时间,即使是循环体中最快的代码,累计迭代上千次,也将带来不小的负担.因此,减少循环的迭代次数可获得显著的性能提升.例如: var iterations = Math.floor(items.length / 8), startAt = items.length % 8, i = 0; do { switch(startAt) { case 0: process(items[i++]); case 7: proce

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

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

JS编程建议——23推荐提高条件性能的策略

建议23:推荐提高条件性能的策略与循环相似,条件表达式决定JavaScript 运行流的走向.与其他语言一样,JavaScript也采用了if 和switch 两种条件结构.由于不同浏览器针对流程控制进行了不同的优化,因此两者在性能上并没有特别大的差异,主要还是根据需求形式进行分析和选择:条件数量较大,建议选择switch 结构,而不是if结构,这样可以使代码更易读:如果条件较少时,建议选择if结构. //条件少 if(found) { //执行代码 } else { //执行代码 } //条件

JS编程建议——29:准确使用循环体(2)

建议29:准确使用循环体(2)2.比较for和while除for in 循环外,其他循环类型的性能相当,难以确定哪种循环执行速度更快.选择循环类型应基于需求而不是性能.可以通过设计for和while循环来完成特定动作的重复性操作.下面分别从语义性.思维模式.达成目标这3个角度来分析如何正确选用while和for循环.(1)从语义性角度比较for和while循环可以按如下模式进行相互转换: for (initialization ; test ; increment ) // 声明并初始化循环变量

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

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

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

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