Точность Xcode Time Profiler - PullRequest
       16

Точность Xcode Time Profiler

1 голос
/ 13 февраля 2020

Я хотел бы знать точное время, необходимое для go с одного экрана на другой. Например, сколько времени требуется для входа в систему и доступа к следующему экрану. Я попытался использовать профилировщик времени Xcode, но он не регистрирует все. Я даже включил опцию «Высокая частота», но все же думаю, что чего-то не хватает. Я понял, что вы должны использовать указатели, чтобы достичь точности. Это работает, но вы должны установить версию iOS на 12, а также изменить код для добавления os_signpost. Есть ли другой способ добиться этого без изменения версии iOS? или код?

Есть ли у вас какие-либо предложения другого инструмента профилирования Xcode или другого инструмента в целом, которые могут дать мне этот вывод?

Я думал, что профилировщик времени даст мне время начала и окончания каждого метода, что-то похожее на профилировщик Android Studio. Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Пара наблюдений:

  1. Да, если вы хотите рассчитать время, прошедшее между двумя точками кода, указатели являются отличным способом сделать это. И если вы хотите знать, что происходит между этими двумя указателями, диапазон «точек интереса», который вы можете увеличить, нажав control . Это позволяет вам сосредоточиться на рассматриваемой области:

    enter image description here

  2. Я бы предложил выбрать «Запись ожидающих потоков». Иногда ваш поток чем-то блокируется, и если вы не выберете эту опцию, он не будет захватывать образцы, когда ваш поток заблокирован, что часто затрудняет поиск виновника.

    enter image description here

    (Я также склонен записывать в режиме отсрочки, чтобы минимизировать эффект наблюдателя.)

  3. Вы сказали

    Вы должны установить свою iOS версию на 12 ...

    Ну, не совсем. Конечно, если вы хотите использовать os_signpost, вы должны выполнить профилирование на устройстве / симуляторе iOS 12, но вам не нужно менять цель вашего приложения. Вам нужно будет только обернуть свои операторы записи в блоки #available, например:

    import UIKit
    import os.log
    
    @available(iOS 12.0, *)
    let pointsOfInterest = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: .pointsOfInterest)
    
    class ViewController: UIViewController {
        @IBAction func didTapNextButton(_ sender: Any) {
            if #available(iOS 12.0, *) {
                os_signpost(.begin, log: pointsOfInterest, name: "Transition")
            }
    
            performSegue(withIdentifier: "Next", sender: self)
        }
    }
    

    и

    import UIKit
    import os.log
    
    class SecondViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            somethingSlow()
        }
    
        override func viewDidAppear(_ animated: Bool) {
            super.viewDidAppear(animated)
    
            if #available(iOS 12.0, *) {
                os_signpost(.end, log: pointsOfInterest, name: "Transition")
            }
        }
    
        func somethingSlow() { ... }
    
    }
    
  4. Если вам не нравится иметь что if #available проверить, и вы должны поддерживать более старые версии ОС, просто используйте kdebug:

    kdebug_signpost_start(0, 0, 0, 0, 0)
    

    и

    kdebug_signpost_end(0, 0, 0, 0, 0)
    

    У вас нет хороших имен на ваших точках диапазон интересов, но он работает в более старых iOS версиях.

Для получения дополнительной информации см. WWD C 2018 video Измерение производительности с помощью ведения журнала .

0 голосов
/ 13 февраля 2020

«Я что-то упустил?» Не совсем. Основная функциональность встроенного инструмента для профилирования времени состоит в том, чтобы находить методы, которые выполняются дольше всего, и дать вам представление о том, где они проводят свое время. Если вы обнаружили, что вы можете go из списка в профилировщике времени к профилированному по времени отображению вашего фактического кода, показывающего время, затраченное на конкретные вызовы внутри него, вы в основном выяснили все, что нужно выяснить , Если вы хотите заключить в скобки определенный c фрагмент кода, это именно то, для чего нужны указатели, как вы сказали.

...