《高性能Javascript》读书笔记-4

第四章

算法和流程控制

代码组织结构和解决具体问题的思路是影响代码性能的主要因素

循环处理是最常见的编程模式之一,也是提高性能的关注点之一

循环分四种:标准for循环

 for (var i = ; i < Things.length; i++) {
Things[i] //循环主题
}

while循环

   var i =;
while(i<){ //前提条件
//循环主题
i++;
}

do-while循环:

 var i =;
do{
//循环主题
}while(i++ <); //后测条件

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);
}
}

递归的问题:终止条件不明确 或者缺少终止条件会导致函数长时间运行 并使得界面处于假死状态

合并排序算法是递归函数可以提升性能  也是最常见的递归算法

 
上一篇:BZOJ1697: [Usaco2007 Feb]Cow Sorting牛排序


下一篇:OCaml Language Sucks