728x90
개요
프로젝트 개발을 하다가 원하는 성능이 나오지 않으면 성능 최적화 작업을 한다.
하다 보면 원하는 성능이 나오는데 프로젝트 말고 그냥 평소에 개념으로 어느것이 더 빠르고 느린지는 알고있지만
실질적으로 몇배나 차이나는지 확실하게 알지 못하는 내용이 있었다
이 [간단한 성능 테스트]는 이러한 개념을 알지만 확실하게 알지 못하는 성능차이를 테스트 하기 위해
글을 작성 하였다.
테스트 전
모든 시간 차이는 내 노트북 기준 입니다.
비교 Spec
- 내용 : DB Insert
- 10000(만)건 Insert
- DB : Mysql
- 조건
- forEach() Insert
- stream().parallel().forEach() Insert
- parallelStream().forEach() Insert
- Bulk Insert
테스트 할 코드
DB 구조
create table POST
(
id int auto_increment,
memberId int not null,
contents varchar(100) not null,
createdDate date not null,
createdAt datetime not null,
constraint POST_id_uindex
primary key (id)
);
Insert 할 테스트 데이터
var posts = IntStream.range(0, 10000)
.parallel()
.mapToObj(i -> easyRandom.nextObject(Post.class))
.toList();
1. forEach() Insert code
// forEach 로 단건으로 입력
posts.forEach(post -> this.postRepository.save(post));
2. stream().parallel().forEach() Insert
// Stream 으로 변환후 병렬처리후 ForEach
posts.stream().parallel().forEach(post -> this.postRepository.save(post));
3. parallelStream().forEach() Insert
// 병렬 Stream 으로 변환 후 ForEach
posts.parallelStream().forEach(post -> this.postRepository.save(post));
4. Bulk Insert
// 간단한 Bulk Insert
this.postRepository.bulkInsert(posts);
결과
그냥 속도는 빠른 순으로 "4 > 3,2 > 1" 로 예상하고 있었다.
Bulk Insert 로 여러 데이터를 한번에 Insert > 병렬로 여러개 Thread를 사용하여 동시 Insert > 정성 스럽게 1개 씩 Insert
이런 정도로만 생각 했다.
걸린 시간(S/초 단위)
- forEach() Insert : 204.591780301s
- stream().parallel().forEach() Insert : 32.9538523s
- parallelStream().forEach() Insert : 31.9208487s
- Bulk Insert : 1.5614143s
후기
빠른 순서는 예상과 같았다.
하지만 2,3번은 병렬 처리를 하더라도 4번과 30배 정도 차이가 나고 1번 Foreach 와는 200배 속도 차이가 난다.
병렬 처리시 그래도 속도는 많이 개선 되었다.
원래 100만건씩 할려고 했지만 도저히 끝나지 않아 만건으로 줄여서 테스트 했다.
아마 FoEach 로 했다면.. 하루 안에 안끝났을꺼 같다.
728x90
'BackEnd > Spring Boot' 카테고리의 다른 글
QueryDSL 1:N처리[수정예정] (0) | 2025.01.30 |
---|---|
트랜잭션 설정 및 아주아주 간단한 팁 (0) | 2024.02.03 |
Propagation (0) | 2023.09.07 |
구독 QueryDSL 및 Redis 사용 개발 (0) | 2023.08.27 |
JPA & QueryDSL 사용한 Project (0) | 2023.08.11 |