一个容易内存溢出的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没有参考任何文章!
- 完全是我自己写的!!
- 我超勇的!!!