각 Swift 메소드의 컴파일 시간을 측정하여 구축 시간 단축

10383 단어 XcodeSwiftiOS
iOS 응용 프로그램의 구축에 시간이 필요하기 때문에 구축 시간을 측정하고 문제가 있는 부분을 수정하여 이 방법을 기술하였다.

전체 구축 시간 측정


우선 전체 구축에 얼마나 걸릴지 측정했다.
터미널에서 다음 명령을 실행하여 Xcode에서 구축하는 데 걸리는 시간을 표시합니다.
defaults write com.apple.dt.Xcode ShowBuildOperationDuration YES
이 작업을 수행하여 Xcode를 다시 시작합니다.정리 후 구축을 진행할 때 다음과 같이 구축 시간을 표시합니다.샘플 응용 프로그램이기 때문에 4.324초입니다.

이 구축 시간이 긴 상황에서 모든 파일, 방법의 시간을 측정한다.

각 파일의 컴파일 시간 측정


(이후 설명한 모든 방법의 측정 방법도 모든 파일의 시간을 얻을 수 있기 때문에 이 항목은 건너뛰어도 문제없다)
모든 파일의 컴파일 시간을 측정하기 위해 xctool을 사용합니다.프로젝트 루트 폴더에서 다음 명령을 실행합니다.
xctool -scheme SchemeName -jobs 1 clean build >> build.txt
Workspace를 사용하는 경우 추가-workspace ProjectName.xcworkspace됩니다.(SchemeName과 ProjectName은 각각 프로젝트의 이름을 지정합니다.)
완성 후 빌드.txt가 생성되었습니다.build.txt에서
      ~ Compile ViewController.swift (3314 ms)
      ~ Compile AppDelegate.swift (290 ms)
이러한 컴파일링 시간이 기록되어 있기 때문에 이 파일을 텍스트 처리하여 파일 이름과 시간을 추출하여 시간 내림차순으로 정렬하면 컴파일링에 시간이 필요한 파일을 알 수 있습니다.
시간이 필요한 서류를 판명했다.그 파일의 어느 부분에 시간이 걸리는지 정보를 원하기 때문에 모든 방법의 번역 시간을 측정합니다.

모든 방법의 번역 시간을 측정하다


각 메서드와 속성의 컴파일 시간을 측정하기 위해 먼저 -Xfrontend -debug-time-function-bodies 를 Xcode에서 측정하고자 하는 대상 건물에 설정된 Other Swift Flags 에 추가합니다.
그리고 Xcode로 정리한 후에 구축하거나 모든 파일의 상황과 같다
xctool -scheme SchemeName -jobs 1 clean build >> build_in_detail.txt
집행
그래서 이 일지에서 다음과 같은 정보를 얻는다.
--------------------------------------------------------------------------------
      ~ Compile ViewController.swift (513 ms)
--------------------------------------------------------------------------------
18.5ms  /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14        @objc get {}
0.1ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14        @objc set {}
0.2ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:5:19 @objc override func viewDidLoad()
0.1ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:9:19 @objc override func didReceiveMemoryWarning()
12.5ms  /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:17:10        @objc func createArray()
3.4ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:22:10        @objc func createDictionary()
0.0ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:7  @objc deinit 
0.3ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
0.2ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc required override init?(coder aDecoder: NSCoder)
이것은 다음 파일의 구축 결과입니다.
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    lazy var strings: [String] = {
        return ["test"]
    }()

    func createArray() {
        let array = ["1", 2, 3.0, CGFloat(4.0)]
        print(array)
    }

    func createDictionary() {
        let dict = ["key1" : "1", "key2" : 2]
        print(dict)
    }

}
13줄의lazy varstrings 속성은 18.5ms를 소비합니다.
17행의createArray 방법은 12.5ms를 소비합니다.이 예에서 결코 느리지는 않지만, 배열된 유형의 인쇄를 하지 않으면 매우 긴 시간이 걸릴 수 있다.
따라서 아래와 같이 타자 인쇄를 더해 다시 구축해 보자.
import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    lazy var strings: [String] = {
        let result: [String] = ["test"]
        return result
    }()

    func createArray() {
        let array: [AnyObject] = ["1", 2, 3.0, CGFloat(4.0)]
        print(array)
    }

    func createDictionary() {
        let dict = ["key1" : "1", "key2" : 2]
        print(dict)
    }

}
결과는 다음과 같다.
--------------------------------------------------------------------------------
      ~ Compile ViewController.swift (493 ms)
--------------------------------------------------------------------------------
1.3ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:34        (closure)
2.6ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14        @objc get {}
0.1ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:13:14        @objc set {}
0.1ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:5:19 @objc override func viewDidLoad()
0.1ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:9:19 @objc override func didReceiveMemoryWarning()
3.8ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:18:10        @objc func createArray()
8.3ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:23:10        @objc func createDictionary()
0.0ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:7  @objc deinit 
0.2ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
0.2ms   /Users/username/Desktop/DurationSample/DurationSample/ViewController.swift:3:40 @objc @objc required override init?(coder aDecoder: NSCoder)
13줄의lazy varstrings는 1.3ms로 단축되었다.또한createArray 방법도 3.8ms로 단축되었다.
이렇게 하면 모든 구축 전체 파일, 모든 방법의 시간을 측정함으로써 구축 시간의 문제점을 파악하고 수정하기 쉽다.번역에 시간이 걸리는 원인은 대부분 형 추리이기 때문에 수조와 사전에 타자를 치면 번역 시간을 단축시킬 수 있다.

좋은 웹페이지 즐겨찾기