异步循环和双层嵌套循环(性能优化nodejs从2.8m到28s)

两步优化:
定位问题:该接口使用多次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)_第1张图片
优化后:
异步循环和双层嵌套循环(性能优化nodejs从2.8m到28s)_第2张图片

你可能感兴趣的:(nodejs,前端性能优化)