Как мне определить, сколько времени занимает выполнение кода в Objective-C / Cocoa в целях оптимизации? - PullRequest
1 голос
/ 16 октября 2008

Допустим, у меня есть два взаимозаменяемых фрагмента кода, и я хочу выяснить, какой из них требует меньше процессорного времени для выполнения. Как бы я это сделал?

Чтобы получить очень приблизительную оценку, я мог бы просто разместить вызовы NSLog () по обе стороны кода, который я хотел профилировать, но кажется, что процессор, в противном случае очень загруженный, мог исказить результаты.

Ответы [ 3 ]

7 голосов
/ 16 октября 2008

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

Xcode включает в себя отличный профилировщик инструмент под названием " Shark ". Для некоторых версий он находится в / Developer / Applications; для других он находится в подкаталоге Performance Tools.

Shark точно скажет вам, сколько времени (в процентах от общего времени выполнения) ваше приложение тратит на каждую часть вашего кода. Идея использования такого инструмента, как Shark, заключается в том, чтобы следовать «правилу 80/20» - ваше приложение будет тратить 80% своего времени на выполнение 20% своего кода, поэтому для достижения наилучших результатов вам следует потратить 80% вашего время оптимизирует те же 20%.

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

2 голосов
/ 16 октября 2008

Woo акула, ура. См. Также Пульт дистанционного управления Shark . В основном, выберите Sampling > Programmatic (Remote) из меню в shark, затем вызовите chudStartRemotePerfMonitor и chudStopRemotePerfMonitor (), заключив в скобки определенный код, который вы хотите профилировать.

Кстати, вот кусок кода, который я храню для определения времени.

Первое использование

uint64_t startTime, stopTime;
startTime = mach_absolute_time();

< work to time goes here >

stopTime = mach_absolute_time();
logMachTime_withIdentifier_(stopTime - startTime, @"10000000 class messages");

и вот вспомогательная функция, logMachTime_withIdentifier_.

#import <mach/mach_time.h>
void logMachTime_withIdentifier_(uint64_t machTime, NSString *identifier) {
    static double timeScaleSeconds = 0.0;
    if (timeScaleSeconds == 0.0) {
        mach_timebase_info_data_t timebaseInfo;
        if (mach_timebase_info(&timebaseInfo) == KERN_SUCCESS) {    // returns scale factor for ns
            double timeScaleMicroSeconds = ((double) timebaseInfo.numer / (double) timebaseInfo.denom) / 1000;
            timeScaleSeconds = timeScaleMicroSeconds / 1000000;
        }
    }

    NSLog(@"%@: %g seconds", identifier, timeScaleSeconds*machTime);
}
1 голос
/ 16 октября 2008

Предполагая, что вы хотите профилировать все приложение (а не просто фрагмент кода), и что ваше приложение написано на C / C ++ / Objective-C (не, например, Ruby), и что вы используете Xcode 3.0 или выше, вы также должны проверить приложение Инструменты. Инструмент «Sampler» даст вам информацию, очень похожую на Shark (правда, иногда без очень полезных советов Shark по повышению производительности). Кроме того, вы можете отслеживать использование других ресурсов (GC, Core Data, сеть, дисковый ввод-вывод и т. Д.), Которые могут быть более важными определяющими факторами производительности вашего приложения, чем эффективности кода (опять же, в зависимости от приложения). Инструменты могут также использовать поддержку DTrace в OS X 10.5 (man dtrace). Вы можете написать свои собственные инструменты, используя DTrace для более точного мониторинга вашего приложения (например, вызовы одного или нескольких методов).

Использование NSLog, как вы подозреваете, является плохой идеей, поскольку она, вероятно, использует систему ведения журнала Apple. Существует недетерминированная задержка при записи журнала в asl, и он появляется в консоли. Я не уверен, когда установлена ​​временная метка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...