• 一个容易内存溢出的js递归循环代码。。。但是可以装杯用???


    有一天思路惊奇的我决定用递归来实现一下循环的代码...然后就emmmmmmmm

            ——这个想法还源自于一个业务来着,那个业务要先循环计算一部分,然后回来的时候要重新计算另一部分东西,然后我看这结构和递归的回调很相似,就顺便写了(递归结束之后还会有一部分在后面的业务,执行完成之后内存才会销毁,期间内存是增量的。对于递归的这个问题有一种方式优化,可以在期间销毁内存(具体百度下c语言递归算法,里面有讲解这部分,但是我改不动了哇。。。这都是我一年前写的东西了,当时也没打算记录来着,,,好多博客都是些到电脑里的,也没上传。管他呢,珍藏个十年八年的放出来才有味道,主要,博客里显示的还是新鲜的!))

    实际上还有更简单的方法来着...核心就一个跳出递归的哨兵位,然后就是把[Function]变成Function(callback)

    对了,循环次数过万就内存溢出了...悠着点儿...这些东西还只是原型呢Σqwq!!!

    // 主要思路是将历史的内容以及当前新增的内容进行重新打包,然后在解压的时候立刻完成。
    let buf;
    let echo =
        function(callback) {
            setTimeout(() => {
                if (callback) echo(callback());
                else console.log('-eof-');
            }, 411);
        }
    
    function pack(callback, oldPack) {
        if (oldPack !== undefined)
            return function() {
                if (oldPack === undefined) return callback;
                return callback(oldPack);
            };
        return callback;
    }
    
    // 使用
    buf = pack(
        function(pack) {
            console.log('todo service 1');
            return pack;
        },
        buf
    )
    buf = pack(
        function(pack) {
            console.log('todo service 2');
            return pack;
        },
        buf
    )
    
    echo(buf);
    

    性能测试环节...老了,也编不动故事了,要不来说个元故事??

    有个傻逼用递归写了个循环,然后尝试把代码丢上去讨个女朋友,然后被别人一脸鄙夷的拒绝了。

    
    // 原型:性能测试 用法如下-------------------------------------------------------------------------------------
    let arr = [];
    
    function service() {
        let letter = 'e';
        let letterCount = 0;
        let person = ['Astroline', 'Eve', 'Alice', 'Jim', 'coco', 'rango'];
        person.forEach(p => {
            for (const pl of p) {
                // console.log(pl);
                if (pl.toLowerCase === letter) letterCount += 1
            }
        });
        return letterCount;
    }
    
    let buf;
    let echo =
        function(callback) {
            if (callback) echo(callback());
            // else console.log('-eof-');
        }
    
    function pack(callback, oldPack) {
        if (oldPack !== undefined)
            return function() {
                if (oldPack === undefined) return callback;
                return callback(oldPack);
            };
        return callback;
    }
    
    // 测试,执行1000条业务所需时间(eof段计入时间但不计入条目,这是方法执行的必须项(或许可以判断callback是否为undefined进行截断?))
    getAvelTime(() => {
        for (let index = 0; index < 1000; index++) {
            buf = pack(
                function(pack) {
                    // console.log('todo service ' + index);
                    // 在内部进行一次业务计算
                    service()
                    return pack;
                },
                buf
            )
        }
    }, '使用递归的方式装载1000条数据', 10);
    
    getAvelTime(() => {
        for (let index = 0; index < 1000; index++) {
            arr.push(function() {
                service();
                // console.log('todo service ' + index);
            })
        }
    }, '使用数组的方式装载1000条数据', 10)
    
    getAvelTime(() => {
        echo(buf);
    }, '解包递归数据用时', 100)
    
    getAvelTime(() => {
        for (let i = 0; i < arr.length; i++) {
            arr[i]();
        }
    }, '解包数组数据用时', 100)
    
    /**
     * 
     * @param {Function} yield 需要测试运行时长的函数
     * @param {string} msg 内容备注
     */
    function getTime(yield, msg) {
        const begin = new Date().getTime();
        yield();
        const end = new Date().getTime();
    
        console.log(`${msg},用时:${end - begin}ms`)
    }
    
    /**
     * 
     * @param {Function} yield 需要测试运行时长的函数
     * @param {string} msg 内容备注
     * @param {number} eval 递归次数
     */
    function getAvelTime(yield, msg, eval = 5) {
        let total = 0;
        let maxTime;
        let minTime;
        let avel;
    
        for (let index = 0; index < eval; index++) {
            const begin = new Date().getTime();
            yield();
            const end = new Date().getTime();
            const time = end - begin;
    
            total += time;
    
            if (maxTime === undefined) maxTime = time;
            if (minTime === undefined) minTime = time;
    
            if (minTime > time) minTime = time;
            if (maxTime < time) maxTime = time
    
        }
        avel = Number(Number(total / eval).toFixed(3))
        console.log(`\n ::: ::: ${msg} ::: ::: \n测试次数:${eval}次\n平均用时:${avel}ms\n单次最高用时:${maxTime}ms\n单次最低用时:${minTime}ms\n`)
    }
    
    // 原型:性能测试结束 -------------------------------------------------------------------------------------
    
    

    至于现在嘛,那个傻逼还是个单身,活该单身。

    附赠一个在我电脑里测试的性能结果

    测试结果

    • 这个demo没有参考任何文章!
    • 完全是我自己写的!!
    • 我超勇的!!!
  • 相关阅读:
    这不是我心目中的比目猪!快来看看这只3D小猪佩奇!
    基于WebGL(ThingJS)的平面图导航,室内导航,3D聚焦 (二)
    通过3D可视化管理应对物联网数据过载——ThingJS油轮3D可视化管理
    阿里云物联网三维可视化套件(ThingJS)使用初体验
    基于WebGL(ThingJS)的平面图导航,室内导航,3D聚焦
    基于WebGL(ThingJS)的家具城 商场 3D展示 3D可视化 DEMO
    基于WebGL(ThingJS)的社区水电燃气管线3D可视化管理演示【三维管线,3D管线,水管可视化】
    js设置聊天信息停留在最底部
    js鼠标进入,延迟显示提示框
    js动态删除表格中的某一行
  • 原文地址:https://www.cnblogs.com/Arunoido/p/15882778.html
Copyright © 2020-2023  润新知