按速度优化JavaScript代码

来源:互联网 发布:cocos3d unity3d 编辑:程序博客网 时间:2024/05/04 19:09

  一旦你的JavaScript能运行,你就会想到使其运行得更快。在讲解加速代码的方法之前,让我先讲讲“80/20规则”:百分之八十的优化 是由最初百分之二十的工作所完成的。竭力实现剩余百分之二十的速度优化是一种巨大的痛苦,而且经常导致完全不能读和难以管理的代码。简言之,如果你的 JavaScript运行得很慢,你可以用很多简单的方法来加速它,但是除非你的代码确实运行得很慢,我不会对它进行再优化。下面是一些使你的代码轻松运 行的方法。


限制循环内的工作量


  程序运行慢的最常见原因是循环内的重复工作。如果一条命令只需要执行一次,就没有必要把它放在循环内。例如:


    var index = 0;


    while (index <10)

    {

      var the_date = new Date();

      var the_day = the_date.getDay();

      var the_name = prompt("what's the kid's name? " ,"");

      alert("On " + the_day + " " + the_name + " is a very special person.");

      index++;

    }


  此程序循环执行10次。每次得到当天的日期,询问小孩的名字,然后打印出“On Monday,so-and-so is a
very special person.”。但是日期是不会改变的,总是今天。所以没有必要把前两行放在循环中。把它们从循环中拿出来,让其只执行一次而不是10次,这样会节省时间:


    var index = 0;

    var the_date = new Date();

    var the_day = the_date.getDay();


    while (index <10)

    {

      var the_name = prompt("what's the kid's name? " ,"");

      alert("On " + the_day + " " + the_name + " is a very special person.");

      index++;

    }


定制if-then-else语句,按最可能到最不可能的顺序

  因为if-then-else语句在遇到条件为真时结束,你可以通过把最有可能的条件放到最开始来减少需要判断的语句的数量。例如:


    var pet = prompt("what kind of pet do you have?", "");


    if (pet == "cat")

    {

      doCatStuff();

    }else if (pet == "dog")

    {

      doDogStuff();

    } else if (pet == "bird")

    {

      doBirdStuff();

    } else if (pet == "lizard")

    {

      doLizardStuff();

    }


  一般来说,程序中的if子句比从lizard到dog需要执行的逻辑判断要少。


最小化重复执行的表达式

  如果你发现需要重复计算一个特定的表达式,如var pi=22/7,只计算一次并把它放在一个全局变量中或
许是个好主意。例如,不象下面程序这样:

    function theArea(radius)

    {

      var pi = 22/7;

      var area = pi * radius * radius;

      return area;

    }

    function theCircumference(radius)

    {

      var pi = 22/7;

      var circumference = 2 * pi * radius;

      return circumference;

    }

而是这样做:

    var pi = 22/7;


    function theArea(radius)

    {

      var area = pi * radius * radius;

      return area;

    }

    function theCircumference(radius)

    {

      var circumference = 2 * pi * radius;

      return circumference;

    }

    我知道我在用一个全局变量,我也说过这不是一个好主意。然而,一些数字,如pi,其值在程序中永远不会改变,是此规则的特例。通过只计算pi一次,可以省 去额外的计算。或许时间上的一些小的节省,累加起来会很管用。如果你发现代码运行很慢,你只要注意一些事情。这些都很明显,但是当你发现你经常忽略象这样 简单的优化技巧时,你会很吃惊。


    (引自<<JavaScript高级教程>>)

原创粉丝点击