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并且您可以将它用于特定类的所有实例,而不仅仅是一个实例,但要谨慎使用.