概述
两步优化:
定位问题:该接口使用多次sql查询,并采用了async,另外在数据的处理中使用了map,forEach嵌套。
方案:
1/使用了bluebird来提升异步并发能力,替代原来的async请求。
2/数据处理确实无法通过优化数据结构减少嵌套,这里采用了for循环来替代map,forEach,虽然降低了代码的可读性,但是这里因为数据量比较大,两层循环的原因,确实能提升些效率。
weightData的length最大168471, totalGmvByEntityData的length最大17383,经过测试对比,两层循环的时候我采用了外大内小和外小内大,分别用时为17361ms和205540ms相差约12倍。
此处贴出双层循环处理数据部分。
fn(weightData, totalGmvByEntityData) {
const weightLength = weightData.length;
const totalGmvByEntityLength = totalGmvByEntityData.length;
console.log(1111, new Date().getTime(), weightLength, totalGmvByEntityLength); // 168471 17383
for (let i = 0; i < weightLength; i++) {
const gmvData = weightData[i];
let weight = 0;
for (let j = 0; j < totalGmvByEntityLength; j++) {
const totalGmvData = totalGmvByEntityData[j];
if (gmvData[3] === totalGmvData[1]) {
weight = gmvData[0] / totalGmvData[0];
if (isNaN(weight) || !isFinite(weight)) weight = 0;
}
}
gmvData[6] = weight;
}
console.log(2222, new Date().getTime());
}
优化前:
优化后:
最后
以上就是复杂水杯为你收集整理的异步循环和双层嵌套循环(性能优化nodejs从2.8m到28s)的全部内容,希望文章能够帮你解决异步循环和双层嵌套循环(性能优化nodejs从2.8m到28s)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复