Как профилировать вызовы методов, не требующих интенсивного использования ЦП, в Instruments?

Если у меня есть следующий метод, есть ли способ использовать Instruments 4.0, чтобы сказать мне, что это заняло одну секунду?

- (IBAction)sleepOneSecond:(id)sender 
{
    sleep(1);
}

Сейчас я использую это, чтобы получить желаемый эффект:

- (IBAction)waitOneSecond:(id)sender 
{
    NSDate * startDate = [NSDate date];
    sleep(1);
    NSLog(@"%s took %lf seconds", __FUNCTION__, 
          [[NSDate date] timeIntervalSinceDate:startDate]);
}

Time Profiler и Sampler просто дают время на CPU, что в данном случае не помогает.


person Andrew    schedule 05.04.2011    source источник


Ответы (2)


В инструменте профилирования времени убедитесь, что для него установлено значение «Все счетчики выборок», а не «Выполнение времени выборки» в разделе «Перспектива выборки».

person Catfish_Man    schedule 05.04.2011
comment
Эти переключатели отключены (серые). - person Andrew; 06.04.2011
comment
Вот что я сделал: построил и профилировал в Xcode 4, запустил инструмент Time Profiler, щелкнул значок информации рядом с Time Profiler, установил флажок «Все состояния потоков», а затем в разделе «Дерево вызовов» я проверил «Показать Obj-C». Только это изменяет отключенное радио кнопки. Кажется, что это где-то на 10-20%, хотя есть что-то более точное или это все? - person Andrew; 06.04.2011
comment
Хм. Не уверена. Я сам скорее пользователь Shark, все еще изучаю темные уголки инструментов. Эквивалентом в Shark является профиль All Thread States, который я использую, когда меня беспокоит время, заблокированное при вводе-выводе, блокировках и т. д. - person Catfish_Man; 07.04.2011
comment
Я все еще новичок в профилировании и на самом деле не использовал акулу. Спасибо за помощь. - person Andrew; 07.04.2011

Профилировщик времени в инструментах не предназначен для определения точного времени для отдельных вызовов методов. Он периодически берет образцы работающего приложения, чтобы определить, где в вашем коде ЦП выполнял инструкции, когда был взят образец. Затем он берет все выборки и оценивает, сколько общего времени было потрачено на каждый метод или функцию. Это называется стохастической выборкой, и она не измеряет, когда вызовы начинаются и заканчиваются. Это всего лишь оценка относительного времени, затрачиваемого на разные части кода, и она предназначена для определения того, какие части вашей программы процессор тратит больше всего, чтобы вы могли сосредоточиться на этих частях для оптимизации. Обычно большая часть времени тратится только на несколько методов во внутреннем цикле, и тратить время на оптимизацию кода где-либо еще — пустая трата времени, потому что удвоение скорости чего-то, что выполняется только в 2% случаев, делает ваш код только на 1% быстрее.

Таким образом, вам нужно будет сделать что-то похожее на то, что вы делаете, если вы хотите достаточно точно знать, сколько времени требуется для выполнения данного раздела кода. Многие люди используют какие-то макросы, чтобы упростить измерение времени, начало и конец, вычисление разницы и ее регистрацию или сохранение времени из нескольких раз с помощью этого кода и усреднения. Конечно, проблема такого метода заключается в том, что само измерение связано с некоторыми накладными расходами (вспомните Гейзенберга). Вы можете свести к минимуму это, выполняя измерения до и после без промежуточного кода и вычитая это число служебных данных из последующих измерений с фактическим кодом между вызовами до и после.

Чтобы сделать то, что вы пытаетесь сделать, вы также можете посмотреть на DTrace для автоматического способа.

person Logachu    schedule 06.08.2011