Objective-C优化

SK9*_*SK9 10 optimization objective-c

是否存在Objective-C的标准优化技巧,以便像C++或"g ++ -fast"标记中的"内联"频繁方法一样更快地执行?

编辑:当theMethod有两个(或更多)整数输入时,有没有人使用SEL和IMP的简短示例?

dre*_*lax 13

这是一个可能不值得花时间实施的小优化,也是我从未亲自使用过的优化,但我想还是很了解.您可以通过直接使用方法实现来绕过重复的方法分派,而不是反复向同一个对象反复发送相同的消息.例如,而不是:

for (int i = 0; i < 100000000; i++)
    [someObject messageWithInt:i];
Run Code Online (Sandbox Code Playgroud)

你可以尝试:

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

for (int i = 0; i < 100000000; i++)
    theMethod (someObject, theSelector, i);
Run Code Online (Sandbox Code Playgroud)

这意味着方法查找只执行一次,您可以直接通过返回的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);
Run Code Online (Sandbox Code Playgroud)

有些小心,您可以保存,theMethod并且您可以将它用于特定类的所有实例,而不仅仅是一个实例,但要谨慎使用.

  • 与大多数性能项一样,您应该在代码上运行Instruments以查看瓶颈所在.上面的项目很棒...如果你需要它们.如果不这样做,它只会使代码难以阅读. (6认同)
  • @nall:绝对.我做了一些基本的基准测试,并且在如上所述的紧密循环中,绕过调度导致大约一半的执行时间(`theMethod`做了一些基本的数学运算).如果在`objc_msgSend`中花费了大量时间(或者这些天所谓的方法),那么绕过调度可能是一种选择,否则,正如你所说,它将更多地是一种混淆而不是优化. (2认同)

out*_*tis 9

优化最好由编译器处理.Mac使用GCC,因此标准优化GCC标志(-O )应该有效.在XCode中,您可以在项目设置中设置优化级别.如果您不使用GCC,请检查编译器文档以了解如何启用优化.

更新:默认情况下,XCode 4使用LLVM后端.GCC和clang前端都使用"-O n "优化标志.对于GCC,n是0到3的整数,或"s"或(仅限Apple)"z".对于clang,n是0到4之间的整数,或"s".