Есть ли стандартные приемы оптимизации для Objective C для создания для более быстрого выполнения вроде "встраивания" частых методов как в C++ или "g ++ - быстро" тег?
Править: У кого-либо есть короткий пример с помощью SEL и IMP, когда theMethod имеет два (или больше) целые числа для входа?
Вот небольшая оптимизация, на реализацию которой, возможно, не стоит тратить время, и которую я никогда не использую лично, но, думаю, все же полезно знать. Вместо того, чтобы многократно отправлять одно и то же сообщение одному и тому же объекту снова и снова, вы можете обойти повторную отправку метода, напрямую используя реализацию метода. Например, вместо:
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
и, возможно, сможете используйте его для всех экземпляров определенного класса, а не только для одного экземпляра, но действуйте осторожно.
Оптимизацией лучше всего занимается компилятор. 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».