第四章
算法和流程控制
代码组织结构和解决具体问题的思路是影响代码性能的主要因素
循环处理是最常见的编程模式之一,也是提高性能的关注点之一
循环分四种:标准for循环
for (var i = 0; i < Things.length; i++) { Things[i] //循环主题 }
while循环
var i =0; while(i<10){ //前提条件 //循环主题 i++; }
do-while循环:
var i =0; do{ //循环主题 }while(i++ <10); //后测条件
for-in循环
for(var pro in object){ //循环主题 }
pro变量赋值给object的一个属性名 返回 属性包括的对象实例属性和 原型链中继承而来的属性
四种循环类型中 只有for-in循环比其他四种明显要慢
不要使用for-in来遍历数组的成员
循环类型的选择应该基于需求而不是性能
减少迭代的工作量:
循环优化的第一步:减少对象成员及数组的查找次数
提高这个循环的性能很简单,只查找一次属性,并把值存储到一个局部变量,然后在控制条件中使用这个变量;
var len = len=Things.length //存储变量 len
for (var i = 0 ; i < len; i++) {
//循环主题
}
还可以颠倒数组来提高循环性能
//减少属性查找 并反转 for (var i =Things.length; i--;) { Things[i] }
控制条件与true做比较,非0得数值转true 等于0的数值则为false;
减少迭代次数
能获得更加显著的新能提升,最知名的一种模式为:达夫设备;
基本概念:每次循环最多可调用8次process() 循环迭代次数为总数除以8;由于不是所有数字都能被8整除,变量stratAt 用来存放余数;表示第一次循环应调用多少次process 如果是12 则第一次循环 调用4次
第二次调用8次 用二次循环替代12次循环;
<script type="text/javascript"> var i = items.length %8; while(i) { process(items[i--]); } i = math.floor(items.length/8); while(i) { process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); process(items[i--]); } </script>
例如 在500000此迭代中 运行速度将比常规循环少70%;
if-else与 switch
最流行的方法是基于测试条件的数量判断,数量越大 越倾向于 switch 而不是 if-else
二分法把值域分成一系列区间,然后逐步减少范围,代码运行的平均时间大约是前面列子的一半,这个方法非常适用于多个值域的需要测试的时候(如果离散值 那么switch更合适)
递归
function digui(n){ if (n==0) { return 1; }else{ return n*digui(n-1); } }
递归的问题:终止条件不明确 或者缺少终止条件会导致函数长时间运行 并使得界面处于假死状态
合并排序算法是递归函数可以提升性能 也是最常见的递归算法