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%。

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

  • 相关阅读:
    HDU4507 吉哥系列故事――恨7不成妻(数位dp)
    UCF Local Programming Contest 2017 G题(dp)
    ICPC Latin American Regional Contests 2019 I题
    UCF Local Programming Contest 2017 H题(区间dp)
    HDU2089 不要62
    AcWing1084 数字游戏II(数位dp)
    UCF Local Programming Contest 2017 F题(最短路)
    Google Code Jam 2019 Round 1A Pylons(爆搜+贪心)
    AcWing1083 Windy数(数位dp)
    Vue
  • 原文地址:https://www.cnblogs.com/lydialee/p/4270169.html
Copyright © 2011-2022 走看看