以下方法从上至下,执行耗时递减
@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