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

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

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


person Lawrence Johnston    schedule 15.10.2008    source источник


Ответы (3)


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

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

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

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

person Sherm Pendley    schedule 15.10.2008
comment
Определенно используйте акулу - это инструмент для повышения производительности, который вы всегда хотели и, наконец, получили. Ссылка Sherm ведет на руководство пользователя. Обязательно пройду через это. Техническая заметка 2086 - еще один отличный справочник: developer.apple.com/technotes/tn/tn2086 .html - person heckj; 16.10.2008

Угу, акула, ура. См. Также Shark Remote Control. По сути, выберите 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);
}
person Ken    schedule 16.10.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 System Logging. Существует недетерминированная задержка при записи журнала в asl, и он отображается в консоли. Я не уверен, когда установлена ​​метка времени.

person Barry Wark    schedule 16.10.2008