Оптимизация Objective-C - PullRequest
       15

Оптимизация Objective-C

9 голосов
/ 29 марта 2010

Существуют ли стандартные приемы оптимизации для Objective-C, позволяющие ускорить выполнение в соответствии с частыми методами "встраивания", как в C ++ или тегом "g ++ -fast"?

Редактировать: Есть ли у кого-нибудь короткий пример использования SEL и IMP, когда у метода есть два (или более) целых числа для ввода?

Ответы [ 2 ]

12 голосов
/ 29 марта 2010

Вот небольшая оптимизация, которая может не стоить потраченного времени на реализацию, и которую я никогда не использую лично, но, думаю, все же полезно знать о ней. Вместо того, чтобы многократно отправлять одно и то же сообщение одному и тому же объекту снова и снова, вы можете обойти повторную отправку метода, напрямую используя реализацию метода. Например, вместо:

for (int i = 0; i < 100000000; i++)
    [someObject messageWithInt:i];

Вы можете попробовать:

SEL theSelector = @selector(messageWithInt:);
IMP theMethod = [someObject methodForSelector:theSelector];

for (int i = 0; i < 100000000; i++)
    theMethod (someObject, theSelector, i);

Это означает, что поиск метода выполняется только один раз, и вы можете вызвать метод напрямую через возвращенное значение IMP. Все реализации метода Objective C принимают как минимум два аргумента, первый аргумент - это принимающий объект типа id, который становится self в реализации метода, а второй аргумент - селектор [типа SEL], который был использован для определения реализации метода и становится _cmd в реализации метода.

Этот подход может быстро сгореть, если вы не используете правильное & ldquo; определение функции & rdquo; (Я не могу вспомнить правильный термин). IMP - это typedef для функции, которая возвращает void* и принимает (id,SEL,...) в качестве аргументов. Это может затруднить использование, если метод на самом деле возвращает что-то еще, например float. Чтобы помочь в этом, вы можете привести возвращаемое значение -methodForSelector:, например:

typedef float (*MyMethodIMP)(id,SEL,int);

SEL theSel = @selector(messageWithInt:);
MyMethodIMP theMethod = (MyMethodIMP)[someObject methodForSelector:theSel];
float result = 0.0;

for (int i = 0; i < 100000000; i++)
    result += theMethod (someObject, theSel, i);

С некоторой осторожностью вы можете сохранить theMethod и, возможно, сможете использовать его для всех экземпляров определенного класса, а не только для одного экземпляра, но осторожно действуйте.

9 голосов
/ 29 марта 2010

Оптимизация лучше всего обрабатывается компилятором. Mac используют GCC, поэтому должен работать стандартный флаг оптимизации GCC (-O level ). В XCode вы можете установить уровень оптимизации в настройках проекта . Если вы не используете GCC, обратитесь к документации по компилятору, чтобы узнать, как включить оптимизацию.

Обновление: XCode 4 по умолчанию использует LLVM бэкэнд. Оба интерфейса GCC и clang используют флаги оптимизации "-O n ". Для GCC n - это целое число от 0 до 3, или «s» или (только Apple) «z». Для clang n представляет собой целое число от 0 до 4 или «s».

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