有没有适用于Objective-C的标准优化技巧,使得执行更快,类似于C++中经常使用的"内联"方法或"g++ -fast"标记?
编辑:有人可以提供一个使用SEL和IMP的简短示例吗?theMethod具有两个(或多个)整数作为输入?
有没有适用于Objective-C的标准优化技巧,使得执行更快,类似于C++中经常使用的"内联"方法或"g++ -fast"标记?
编辑:有人可以提供一个使用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
,并且您可能能够将其用于特定类的所有实例,而不仅仅是一个实例,但一定要小心谨慎。
theMethod
进行了一些基本的数学计算)。如果在 objc_msgSend
(或者现在叫什么方法)中花费了很多时间,那么绕过调度可能是一个选项,否则,就像你说的那样,这将更多地是一种混淆而不是优化。 - dreamlax