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

Есть ли стандартные приемы оптимизации для Objective C для создания для более быстрого выполнения вроде "встраивания" частых методов как в C++ или "g ++ - быстро" тег?

Править: У кого-либо есть короткий пример с помощью SEL и IMP, когда theMethod имеет два (или больше) целые числа для входа?

10
задан SK9 13 April 2010 в 06:36
поделиться

2 ответа

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

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 в реализации метода.

Этот подход может быстро испортиться, если вы не используете правильное «определение функции» (я не могу вспомнить правильный термин). 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 и, возможно, сможете используйте его для всех экземпляров определенного класса, а не только для одного экземпляра, но действуйте осторожно.

13
ответ дан 3 December 2019 в 17:57
поделиться

Оптимизацией лучше всего занимается компилятор. 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».

9
ответ дан 3 December 2019 в 17:57
поделиться