两步优化:
定位问题:该接口使用多次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 total