Как я могу измерить время между двумя строками кода на Objective-C для iOS?

У меня есть следующий код, который берет некоторое время для обработки:

self.itemsArray = [Helper changeTheA:self.itemsArray];
self.itemsArray = [Helper convertDates:self.itemsArray];

есть ли способ, в документах или где-то еще, что я могу измерить время необходимое для перехода от первой строчки кода до второй строчки кода.... в тиканье или миллисекундах?

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

3 ответов


самый быстрый, грязный, возможно, не очень точный способ

NSDate *startDate = [NSDate date];

self.itemsArray = [Helper changeTheA:self.itemsArray];

NSLog(@"changeTheA time taken: %f", -[startDate timeIntervalSinceNow]);

немного более активное, но, вероятно, более полезное решение, если вы делаете некоторые основные профилирования можно увидеть здесь, он использует функцию C, которая выполняет предоставленный вами блок.


большой Примечание

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


да. Для этого нужно использовать пробоотборник инструментов.

запустите приложение, выполните программу на некоторое время, затем найдите символ в инструментах, который содержит:

self.itemsArray = [Helper changeTheA:self.itemsArray];
self.itemsArray = [Helper convertDates:self.itemsArray];

он должен показывать весы строка за строкой. Также обратите внимание, что приборы позволяют задавать частоту дискретизации, вплоть до 40 микросекунд.


Я бы использовал следующий код:

NSTimeInterval start = CACurrentMediaTime();

// your code goes here

NSTimeInterval end = CACurrentMediaTime();
NSTimeInterval delta = end - start;
NSLog(@"Execution took %f seconds.", delta);

это намного точнее, чем NSDate.