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


    第四章

    算法和流程控制

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

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

    循环分四种:标准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);
                   }
               }

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

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

     
  • 相关阅读:
    asp.net 框架接触(2)
    解决:C++ 中 main函数 wmain函数 _tmain函数 WinMain函数 wWInMain函数 _tWinMain函数的区别
    实现:创建/复制/移动文件API
    实现:类模板的数组类封装
    python3 解析shodan_json数据
    实现:API实现创建用户并且添加至管理员
    学习:类模板
    网展cms后台任意文件删除和sql注入
    选择排序
    实现:函数模板实现不同数据类型数组进行排序
  • 原文地址:https://www.cnblogs.com/h5monkey/p/5927274.html
Copyright © 2020-2023  润新知