一个容易内存溢出的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没有参考任何文章!
  • 完全是我自己写的!!
  • 我超勇的!!!
posted @ 2022-02-11 13:18  Astroline  阅读(190)  评论(0编辑  收藏  举报