비동기 작업들을 for of을 사용해 해왔었던 내 코드들을 보고 프로젝트를 같이 했던 팀장이
병렬처리를 하는 게 낫지 않겠냐는 말을 해줘서 무릎을 탁! 쳤다.
왜 내가 처리 할 생각을 못했을까! 내가 짠 코드를 보고 병렬로 다시 작업을 해봤다!
appleInfo = {};
console.time("start1")
for(const id of apples) {
const origin: string = await this.appleRepository.getAppleOrigin(id);
appleInfo[id] = origin;
}
console.timeEnd("start1")
...
// 결과
start1: 11.024ms
start1: 10.628ms
start1: 9.194ms
start1: 51.812 (??)
마지막 값이 좀 튀었는데 for of문을 사용했을 경우 평균적으로 10ms의 처리속도가 나왔다.
appleInfo = {};
console.time("start2")
Promise
.all(
apples.map(async (id) => {
const origin: string = await this.appleRepository.getAppleOrigin(id);
appleInfo[id] = origin
}))
.catch((err) => console.log(err))
console.time("start2")
start1: 1.545ms
start1: 0.973ms
start1: 0.597ms
start1: 0.601ms
병렬로 작업했을 경우 평균 1ms 이하의 속도가 나왔다. 실제 테스트한 코드는 1~2줄의 작업코드가 추가 되어있다는 것을 감안하더라도
속도가 10배 넘게 차이가 나는 것을 확인할 수 있다.
순서를 보장할 필요없는 반복 작업은 병렬로 처리 하도록 하자!