ios 高性能方法调用优化(IMP)

以下方法从上至下,执行耗时递减
@implementation DesObj
- (void) operate
{
}
//高级接口调用
- (void) runNaive
{
   int  n;
   int  i;
   id   p;
   n   = [_array count];
   for( i = 0; i < n; i++)
   {
      p = [_array objectAtIndex:i]; 
      [p operate];
   }
}
//core调用
- (void) runNaiveCore
{
   int  n;
   int  i;
   id   p;
  
   n   = [_array count];
   for( i = 0; i < n; i++)
   {
      p = CFArrayGetValueAtIndex( (CFArrayRef) _array,
                                  (CFIndex) i); 
      [p operate];
   }
}
//core调用2,将method上提
- (void) runNaiveCore2
{
   void	 *(*f)();
   int  n;
   int  i;
   id   p;
  
   f   =  (void *) CFArrayGetValueAtIndex;
   n   = [_array count];
   for( i = 0; i < n; i++)
   {
      p = (*f)( _array, i);
      [p operate];
   }
}
//runtime调用
- (void) runFast 
{
   SEL   operateSel;
   void	 *(*f)();
   int   n;
   int   i;
   id    p;
   id    (*objc_call)( id, SEL, ...);   
  
   objc_call = objc_msgSend;
 
   f   =  (void *) CFArrayGetValueAtIndex;
   n   = [_array count];
   
   for( i = 0; i < n; i++)
   {
      p = (*f)( _array, i);
      (*objc_call)( p, @selector( operate));
   }
}
//直接寻址
- (void) runFastest
{
   IMP            lastOpIMP[ 8];
   Class          lastIsa[ 8];
   Class          thisIsa;
   unsigned int   index;
   void	          *(*f)();
   int            n;
   int            i;
   id             p;

   f   =  (void *) CFArrayGetValueAtIndex;
   n   = [_array count];

   memset( lastIsa, 0, sizeof( lastIsa));

   for( i = 0; i < n; i++)
   {
      p = (*f)( _array, i);
      
      thisIsa = _isa( p);
      index   = ((unsigned long) thisIsa >> 4) & 7; 

      if( lastIsa[ index] != thisIsa)
      {
         if( ! (lastOpIMP[ index] = class_lookupMethod( thisIsa, @selector( operate))))
            [NSException raise:NSGenericException
                        format:@"No operate method on class %s", 
               ((struct objc_class *) thisIsa)->name];
         lastIsa[ index] = thisIsa;
      }
      (*lastOpIMP[ index])( p, @selector( operate));
   }
}
@end

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值