zoukankan      html  css  js  c++  java
  • JavaScript 循环性能比较

    有一句话叫做 没有什么事是一个循环解决不了的,如果真有,那就再来一个循环。

    循环的种类有很多

    正向for循环,逆向for循环,while循环,for-in循环(理论上性能最差),for-each循环,duff's device循环(理论上性能最好)

    直接上代码

    <html>
        <head>
            <meta charset="UTF-8">
            <title></title>
            
        </head>
        <body>
            
        </body>
        <script type="text/javascript">
            var number = 100000;//array大小
            var iteranum = 100;//迭代次数
            var array = [];
            for(let i=0;i<number;i++)
            {
                array[i] = i+1;
            }
    
            //test cicle 
            var len = array.length;
            //正常for循环
            console.time('normal for');
            for(let k=0;k<iteranum;k++)
            {
                for(let i=0;i<len;i++)
                {
                    array[i]+1;
                }
            }
    
            console.timeEnd('normal for');
    
            //倒序for循环
            console.time('reverse for');
            for(let k=0;k<iteranum;k++)
            {
                for(let i=len-1;i--;)
                {
                    array[i]+1;
                }
            }
            console.timeEnd('reverse for');
    
            //while循环
            console.time('while');
            for(let k=0;k<iteranum;k++)
            {   
                let i=0;
                while(i<len)
                {
                    array[i]+1;
                    i++;
                }
            }
            console.timeEnd('while');
    
            //for-in循环
            console.time('for-in');
            for(let k=0;k<iteranum;k++)
            {
                for(let i in array)
                {
                    array[i]+1;
                }
            }
            console.timeEnd('for-in');
    
            //for each 循环
            console.time("for each");
            for(let k=0;k<iteranum;k++)
            {
                array.forEach(function(e){
                    e+1;
                });
            }
            console.timeEnd("for each");
    
            //duff's device 循环
            console.time("device's device");
            for(let k=0;k<iteranum;k++)
            {
                let j = len % 8;
                let templen = len-1;
                while(j){
                    j--;
                    array[templen--]+1;
                }
    
                j = Math.floor(len / 8);
    
                while(j){
                    j--;
                    array[templen--]+1;
                    array[templen--]+1;
                    array[templen--]+1;
                    array[templen--]+1;
                    array[templen--]+1;
                    array[templen--]+1;
                    array[templen--]+1;
                    array[templen--]+1;
                }
            }
            console.timeEnd("device's device");
        </script>
    </html>

    来看看执行后的结果,执行环境是 win7,chrome 版本 59.0.3071.86(正式版本) (64 位)

    可以看到for-in所花的时间最长,而device's时间最短,对于少量的数据,比如在1000次以下差别不会很大

    总结

    1、总体来说for循环和for-each性能相当,在小数据量时也与while性能相当。for-in性能最差,duff's device性能最好。大数据量时,while性能优于for循环和for-each循环。

    2、对于数据量不大的循环(<1000),不用考虑使用哪一种性能更好,可读性是第一位。

    3、对于有较大数据量的循环和遍历,如果性能不是瓶颈,那么普通的for循环(或者while,do-while,for-each)就可以了,毕竟可读性强。

    4、对于较大的数据量,如果array的循环操作已经成为瓶颈,或者性能非常重要,那么可以采用duff's device方案。

    5、任何时候都不建议使用for-in,除非必须要用。

  • 相关阅读:
    JS正则手机靓号处理AB ABAB AABB
    url参数中有+、空格、=、%、&、#等特殊符号的问题解决
    LigerUI 使用教程表格篇
    JS获取地址栏参数
    手机端meta
    最大连续子序列 hdu 1231
    I NEED A OFFER! hdu1203(背包)
    Bookshelf 2 poj3628(01背包/DFS)
    Charm Bracelet poj3624(01背包)
    985的方格难题(dp)
  • 原文地址:https://www.cnblogs.com/shenjp/p/6971569.html
Copyright © 2011-2022 走看看