zoukankan      html  css  js  c++  java
  • javascript循环---性能优化

    循环是编程中是最为常见的结构,优化循环是性能优化中很重要的一个部分。

    1. 减值迭代:大多数循环使用一个从0开始、增加到某个特定值的迭代器。在很多情况下,从最大值开始,在循环中不断减值的迭代器更加高效。
    2. 简化终止条件:如前所说,属性查找或者其它O(n)的操作不应该出现在终止条件这个地方。
    3. 简化循环体:循环体是执行最多的,一定要确保没有某些可以被很容易移出循环的密集计算。
    4. 使用后测试循环:最常用的for循环和while循环都是前测试循环,而如do-while为后测试循环,可以避免最初终止条件的计算,因此运行更快。

    当循环的次数是确定的,不用循环往往更快。如:数组有三个元素,直接对数组操作,展开循环可以消除建立循环和处理终止条件的额外开销。如果循环中的迭代数不能事先确定,那可以使用一种叫做Duff装置的技术。这个技术是以其创建者Tom Duff命名的,最早在C语言中使用这项技术。Jeff Greenberg用javascript实现了Duff装置。基本概念是通过计算迭代的次数是否为8的倍数将一个循环展开为一系列语句。

    //credit: Jeff Greengerg for JS implementation of Duff's Device
    var iterations = Math.floor(values.length / 8 );
    var startAt = values.length % 8 ;
    var i = 0;
    do {
        switch(startAt){
            case 0:process(values[i++]);
            case 7:process(values[i++]);
            case 6:process(values[i++]);
            case 5:process(values[i++]);
            case 4:process(values[i++]);
            case 3:process(values[i++]);
            case 2:process(values[i++]);
            case 1:process(values[i++]);
        }
        startAt = 0;
    }while(-- iterations > 0 );

    Duff装置的实现是通过将values数组中元素个数除以8来计算出循环需要进行多少次迭代,然后使用取整的下限函数确保结果是整数。当然,可能会有一些不能被处理到的元素,这个数量保存在startAt变量中,首次执行会对其进行额外的调用 。

    由Andrew B. King在Speed Up Your Site(New Riders,2003)提出更快的Duff装置:

    //credit :Speed Up Your Site (New Riders,2003)
    var iterations = Math.floor(values.length /8 );
    var leftover = value.length % 8;
    var i=0;
    if(leftover >0){
        do{
            process(values[i++]);
        }while(--leftover >0);
    }
    do {
        process(values[i++]);
        process(values[i++]);
        process(values[i++]);
        process(values[i++]);
        process(values[i++]);
        process(values[i++]);
        process(values[i++]);
        process(values[i++]);
    }while(--iterations > 0);

    这个方法几乎比原始的Duff装置实现快40%。

    对于大数值量使用展开循环可以节省很多时间,小数据量,额外的开销则划不来了。

  • 相关阅读:
    Beta 第七天
    Beta 第六天
    Beta 第五天
    Beta 第四天
    Beta 第三天
    Beta 第二天
    Beta 凡事预则立
    Beta 第一天
    Beta 集合
    打造专属测试平台5-使用Docker部署MySQL数据库
  • 原文地址:https://www.cnblogs.com/lydialee/p/4270169.html
Copyright © 2011-2022 走看看