일주일 동안 애플리케이션 성능이 5배 향상되면

14429 단어 SwiftiOS
스위프트 어드벤트 캘린더의 2018년 7일째다.
며칠 전 개발 중인 앱의 원형을 완성해 자신만만하게 친구들에게 보여줄 수 있는 곳.
움직이고 있지만 동작이 무겁네요.
충격을 받아서 나는 이틀 동안 안심한 상태였다.
하지만!그 이후로 일주일 동안 성능 개선에 집중하고 있습니다.
가동 시간을 대폭 개선하는 데 성공했다.

그때의 노력이 바보처럼 느린 이유를 정리한 결과 얼마나 줄어들 수 있었는지.
※ 물론 효과는 프로젝트별 시행에 달렸습니다.나는 단지 하나의 예로 참고했으면 좋겠다고 생각한다.

① TIME PROILER 활용(-5.6 s)


먼저 Xcode Instruments의 기능인 TIME PROILER를 기본 열쇠로 사용했습니다.
참조: Xcode Instruments의 Time Profile을 사용하여 무거운 처리를 조사합니다.
이 기능은 라인을 펴서 시간이 걸리는 처리를 찾아낼 수 있다.

이유: Date의 Extention


당연한 일이지만 순환 안에서 실례를 만드는 것은 반모드다.
그러나 Date에 다음과 같은 편리한 Extention이 저장되어 있어 눈치채지 못했다.
DateExtention.swift
extension Date {
    var calendar: Calendar {
        var calendar = Calendar(identifier: .gregorian)
        calendar.timeZone = .current
        calendar.locale   = .current
        return calendar
    }

    var zeroclock: Date {
        return fixed(hour: 0, minute: 0, second: 0)
    }

    static var now: Date {
        return Date()
    }

    static var today: Date {
        return now.zeroclock
    }

    func fixed(year: Int? = nil, month: Int? = nil, day: Int? = nil, hour: Int? = nil, minute: Int? = nil, second: Int? = nil) -> Date {
        let calendar = self.calendar

        var comp = DateComponents()
        comp.year   = year   ?? calendar.component(.year,   from: self)
        comp.month  = month  ?? calendar.component(.month,  from: self)
        comp.day    = day    ?? calendar.component(.day,    from: self)
        comp.hour   = hour   ?? calendar.component(.hour,   from: self)
        comp.minute = minute ?? calendar.component(.minute, from: self)
        comp.second = second ?? calendar.component(.second, from: self)

        return calendar.date(from: comp)!
    }
}
이런 Extention은 매우 편리하지만 실제로는 다음과 같은 방대한 시간을 먹었다.
func updateItems() {
    items.forEach{
        if $0.end.zeroclock < Date.today {
            deleteItems($0)
        }
    }
}
이 처리는 그룹 요소의 수량만Date,DateComponents,Calendar의 초기화입니다.
그 중에서도 DateComponents, Calendar의 초기화는 반복되는 일로 거대한 시식충이 되었다.
이용한 DateComponents,Calendar는 static으로 미리 발표하는 것이 좋다.
extension DateFormatter {
    static var Current:DateFormatter = {
        let formatter = DateFormatter()
        formatter.locale = .current
        formatter.timeZone = .current
        return formatter
    }()
}

extension Calendar {
    private static var Current: Calendar = {
        var calendar = Calendar(identifier: .gregorian)
        calendar.timeZone = .current
        calendar.locale   = .current
        return calendar
    }()
}
원래 데이트는 절대 시간축의 어느 한 부분을 가리키는 반이다.
나는 상대적인 시간을 처리할 때Calendar반을 처리하는 것이 옳다고 생각한다.
매번 Date 클래스를 초기화할 필요가 없다면 순환 이외에 초기화하십시오.
숨겨진 역모드는 TIME PROILER를 사용하여 찾을 수 있습니다.
여기에 단숨에 5.6초 단축에 성공한 요소도 수천 가지다.

웹 서비스를 능숙하게 사용하는 API(-2.2s)


웹 서비스의 API 사양을 이해하고 적합한 논리적 설계를 함으로써 응용의 성능을 개선할 수 있다.
이번에는 Google Calendar API 방법을 활용해 성능을 개선했다.
소스 코드는 언급하지 않지만 Google Calendar에서 사용자의 캘린더 이벤트를 가져올 때, 삭제된 스케줄, 변경된 이벤트를 프로그램에 반영하기 위해 처음에는 특정 기간의 모든 캘린더 이벤트를 가져오지만
1.synctoken을 사용하는 차이점만 획득
2. showDeleted 매개 변수를 설정하여 삭제된 달력 이벤트를 가져옵니다
3. 이벤트 ID를 사용하여 로컬 DB의 달력 이벤트를 업데이트하고
이러한 변경으로 인해 데이터의 취득 속도가 빨라졌다.
Google API는 매우 강력한 기능을 가지고 있기 때문에 문서를 잘 읽어야 합니다.
이 논리적 설계에 따라 성능을 개선할 수 있다.

데이터는 적당한 시기에 준비해야 한다(-21s)


시작할 때 다중 처리를 실행하면 당연히 시작 시간을 차지합니다.
현재 화면에 필요한 정보'를 고려하여 적절하게 처리하면 성능을 개선할 수 있다.
이번에는 Google 달력에서 유휴 시간을 가져오는 애플리케이션입니다.
시작 시
1. Google 달력에서 정보 얻기
2. 예정된 여유 시간 계산
3. 각 항목에 설정된 기간 동안 유휴 시간 필터링
4. 연속 시간 결합
이렇게 처리했습니다.
그러나 3, 4의 처리는 사실상 옥상 화면에서 이용되지 않았다
프로젝트를 선택할 때 화면이 이동하는 시간과 계산 처리를 분리하면 처리를 생략할 수 있습니다.
또 처리 대상의 항목 수도 대폭 삭감할 수 있기 때문에 계산 처리가 상당히 빨라졌다.
이렇게 하면 3.8초 단축에 성공할 수 있다.

올바른 스레드 제어(-0.7s)


iOS는 UIKit의 수명 주기 동안 주 경로에서만 UI를 제어할 수 있습니다.
따라서 그리는 동안 계산을 다시 작성하면 UI 업데이트가 차단됩니다.
DispatchQueue 및 RxSwift를 사용하여 UI 업데이트 이외의 처리는 가능한 한 다른 스레드에서 처리
중요한 것은 통신, 계산 처리를 통해 UI를 차단하지 않는 것이다.
DispatchQueue.global(qos: .background).async {
   //データの通信処理など
}

//RxSwift
//observeOnで細かくスレッドの指定ができる
downloadItems
    .observeOn(MainScheduler.asyncInstance)
    .subscribe(onNext: { [weak self] items in
        //UIの更新処理
    })
    .disposed(by: disposeBag)
여기에 0.7초의 고속화 성공!

최후


총 -10.6초 동안 시작 시간을 1/5로 변경하는 데 성공했습니다.
나는 연기를 개선하는 것이 일종의 성실하고 고독한 시련이라고 생각한다
엔지니어의 실제 복장은 확실한 숫자로 표시할 수 있고 응용 소프트웨어의 UX로 볼 수 있다는 것을 중시한다
이것은 간단하면서도 재미있는 꽃 작업이다.앞으로도 자신의 기술을 계속 연마하고 싶다.
며칠 전 두 달간의 개발 기간을 거쳐 용도에 따라 자신의 달력만 공유할 수 있는 여가 시간
TIMEPACK 애플리케이션의β판을 내다.
BUG는 아직 많지만 사용자로부터 피드백을 받는 동시에 칭찬을 많이 하는 개선 중이다.
저에게 피드백을 줄 수 있다면 정말 좋겠습니다!

좋은 웹페이지 즐겨찾기