🩵 CoreData의 삭제를 구현하던 중...
기존에는 단순하게 생각해서 filter라는 고차함수를 사용해서 해당하는 요소를 필터링해주었습니다.
let filteredData = todos.filter { String(describing: $0.id) == id }[0]
context.delete(filteredData)
기본적인 구현을 다 끝내고 코드를 정리하던 중, 한 가지 의문이 들었습니다.
filter()는 검색된 값을 배열에 담아 반환해줍니다.
그런데 어차피 상세페이지에서만 삭제가 가능한데, 해당하는 요소는 1개인데도 배열로 반환시킬 필요가 있나?
🩵 filter()와 first()의 차이점
filter() 메서드는 주어진 조건을 만족하는 요소만을 새로운 배열로 반환합니다.
반면, first() 메서드는 주어진 조건을 만족하는 첫 번째 요소를 반환합니다.
게다가 filter()는 전체 요소를 반드시 1회씩 체크하지만 first()는 일치하는 요소가 검색되면 탐색을 종료합니다.
현재는 데이터를 많이 사용하지 않기 때문에 크게 성능에 차이가 없겠죠?
하지만 추후.. 대용량의 정보를 다룰 때는 유의미한 차이가 있을 것이라고 생각했습니다.
🩵 filter()와 first()의 시간복잡도
filter() 메서드는 O(n)의 시간복잡도를 가지는 반면, first() 메서드는 O(log n)의 시간복잡도를 가집니다.
filter() 메서드는 주어진 조건을 만족하는 요소를 하나씩 확인하여 새 배열에 추가합니다.
배열의 크기가 n이면, filter() 메서드는 n번의 연산을 수행해야 합니다.
따라서, filter() 메서드의 시간 복잡도는 O(n)입니다.
func filter(_ predicate: (Element) -> Bool) -> [Element] {
var result = [Element]()
for element in self {
if predicate(element) {
result.append(element)
}
}
return result
}
first() 메서드는 주어진 조건을 만족하는 첫 번째 요소를 찾기 위해 이진 검색을 사용합니다.
이진 검색은 배열의 크기가 n이면, log n번의 연산을 수행하여 원하는 요소를 찾을 수 있습니다.
따라서, first() 메서드의 시간 복잡도는 O(log n)입니다.
func first(where predicate: (Element) -> Bool) -> Element? {
for element in self {
if predicate(element) {
return element
}
}
return nil
}
따라서, 일치하는 요소의 개수가 n일 때, filter() 메서드는 first() 메서드보다 n배 느릴 수 있습니다.
일치하는 요소가 단 1개라는 것이 명확하다고 해도
모든 요소를 검색하지 않는 first() 메서드를 사용하는 것이 성능에 유리할 수 있다고 생각이 듭니다.
🩵 Date().timeIntervalSince()로 확인하기
해당하는 날짜와 다른 특정 날짜 사이의 간격을 반환하는 메서드입니다.
start로 날짜값을 하나 생성해두고 end에서 현재 날짜값에 start를 비교해서 그 사이 간격 시간을 구해서 확인해보았습니다.
filter를 사용한 경우
let start = Date()
let filteredData = todos.filter { String(describing: $0.id) == id }[0]
let end = Date().timeIntervalSince(start)
first를 사용한 경우
let start = Date()
let filteredData = todos.first { String(describing: $0.id) == id }
let end = Date().timeIntervalSince(start)
이렇게 확인해보니 그렇게 큰 작업이 아닌데도 first가 조금이나마 더 빠른것을 확인할 수 있었습니다.
🩵 결론
일치하는 값이 여러개라면 filter를 사용하는게 마땅하지만,
1개라면 first를 사용해 보는 것도 코드에 도움이 될 수 있을 것 같습니다!
https://developer.apple.com/documentation/swift/array/first
first | Apple Developer Documentation
The first element of the collection.
developer.apple.com
https://developer.apple.com/documentation/foundation/date/1779636-timeintervalsince
timeIntervalSince(_:) | Apple Developer Documentation
Returns the interval between this date and another given date.
developer.apple.com
'iOS > Swift' 카테고리의 다른 글
[Swift] iOS 스플래시 / 런치 스크린 화면 만들기 (0) | 2024.02.13 |
---|---|
[Swift] Core Data(1) - 사용 설정하기 (0) | 2024.02.02 |
[Swift] 아키텍처 Architecture(1) - MVC 패턴 (1) | 2024.01.27 |
[Swift] 네트워크 통신(2) - URLSession(GET)과 Decodable 프로토콜 (1) | 2024.01.04 |
[Swift] 네트워크 통신(1) - URL과 REST API (1) | 2024.01.04 |