-
Notifications
You must be signed in to change notification settings - Fork 1
[성능] 필터링 걸고 아이템을 체크했을 때 앱의 반응속도가 느려지는 현상
Ari edited this page Jul 24, 2022
·
1 revision
수집하지 못한 아이템으로 필터링을 걸어둔 상태에서 아이템을 수백개 체크해보았는데, 수집한 아이템이 늘어날수록 체크버튼을 터치했을 때, 앱의 반응 속도가 떨어지는 것을 발견해버렸다. 이를 해결하기 위해 원인을 분석해보았다.
- 먼저 Date 타입을 활용하여 성능 저하가 의심되는 구간의 실행 시간을 측정해보았다.
![183871212768555](https://user-images.githubusercontent.com/75905803/180610707-d9030a46-4572-4054-bff5-6f77c6f8e9c8.png)
![Pasted Graphic](https://user-images.githubusercontent.com/75905803/180610711-10305fb1-e92c-4e83-b9b6-d0e2861f8f7d.png)
- 그랬더니 위와 같이 획득 아이템의 숫자가 많아질 수록 실행 시간이 늘어나는 것을 확인할 수 있었다.
- 당시 필터링 하던 코드는 다음과 같았는데...
![Pasted Graphic 2](https://user-images.githubusercontent.com/75905803/180610727-8bedfddb-7f19-4c0a-8488-ab76cc490aae.png)
- 살펴보니 이중 반복문과 다름이 없는 필터링 코드였다. (시간 복잡도가 O(n)인 듯...) 그래서 이 부분을 개선하기 위해서 구글링을 시도해보았다.
- 쉬운 방법으로 Set를 활용해보라는 답변을 참고하여 수정을 진행했다. 최상의 성능을 위해 BitSet을 사용하는 방법도 있지만, 나는 필터링만 하고 다시 배열로 변환할거기 때문에 이 방법은 패스했다.
![Pasted Graphic 4](https://user-images.githubusercontent.com/75905803/180610850-efc4a79e-9026-45a9-9a6a-34e49dfcf6ad.png)
- 위와 같이 대칭차 집합연산을 활용해서 전체 아이템에서 수집아이템이랑 겹치지 않는 아이템을 필터링 하였고 이를 통해 성능을 개선할 수 있었다.
획득 아이템이 아까보다 더 많지만, 일정한 실행시간을 보여주고 있다. 이전에는 0.3초까지 늘어났었다.
![0 029374003410339355](https://user-images.githubusercontent.com/75905803/180610895-f763cb7b-1d95-46e3-9162-09e0f578ef44.png)
시간 복잡도를 항상 알고리즘 문제 풀이에서만 신경써오다가... 실제 개발을 할때 문제를 맞닥뜨리니, 새삼 시간복잡도가 개발에 있어서 중요한 요소임을 다시 한번 깨닫게 되었다.
- [성능] 필터링 걸고 아이템을 체크했을 때 앱의 반응속도가 느려지는 현상
- [RxSwift] Cell에 ViewModel을 할당하여 바인딩 처리할 때 주의해야할 점
- [ARC] dismiss 혹은 popViewController 호출 이후에도 메모리 할당이 해제되지 않는 이유?
- [UIKit] CollectionView의 높이를 콘텐츠 높이에 따라 동적으로 레이아웃 설정하는 법
- [UIKit] UICollectionView의 Cell Dynamic Size 지정해주기
- [UIKit] Navagation title을 줄바꿈 할 수는 없을까?
- [UIKit] Progress Bar의 높이를 변경하는 방법
- [UIKit] 왜 네비게이션 타이틀이 Large가 아닌 small로 나오는 걸까?
- [Xcode] LaunchScreen.storyboard에 배경색을 커스텀색상을 사용했는데, 다크모드가 작동하지 않는 현상
- [Xcode] 실제 디바이스로 앱을 테스트 하던 도중 발생한 문제