NSLock: 3.157997 sec
NSLock+IMP Cache: 3.212774 sec
pthread_mutex: 1.524530 sec
OSSpinlock: 0.293235 sec
@synchronized: 3.483270 sec
代码 objc:
#define ITERATIONS (1024*1024*32) for(i=0;i<ITERATIONS;++i){ //lock code }
具体代码如下
代码 objc:
#define ITERATIONS (1024*1024*32) static unsigned long long disp=0, land=0; int main() { double then, now; unsigned int i, count; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; OSSpinLock spinlock = OS_SPINLOCK_INIT; NSAutoreleasePool *pool = [NSAutoreleasePool new]; NSLock *lock = [NSLock new]; then = CFAbsoluteTimeGetCurrent(); for(i=0;i<ITERATIONS;++i){ [lock lock]; [lock unlock]; } now = CFAbsoluteTimeGetCurrent(); printf("NSLock: %f sec\n", now-then); then = CFAbsoluteTimeGetCurrent(); IMP lockLock = [lock methodForSelector:@selector(lock)]; IMP unlockLock = [lock methodForSelector:@selector(unlock)]; for(i=0;i<ITERATIONS;++i){ lockLock(lock,@selector(lock)); unlockLock(lock,@selector(unlock)); } now = CFAbsoluteTimeGetCurrent(); printf("NSLock+IMP Cache: %f sec\n", now-then); then = CFAbsoluteTimeGetCurrent(); for(i=0;i<ITERATIONS;++i){ pthread_mutex_lock(&mutex); pthread_mutex_unlock(&mutex); } now = CFAbsoluteTimeGetCurrent(); printf("pthread_mutex: %f sec\n", now-then); then = CFAbsoluteTimeGetCurrent(); for(i=0;i<ITERATIONS;++i){ OSSpinLockLock(&spinlock); OSSpinLockUnlock(&spinlock); } now = CFAbsoluteTimeGetCurrent(); printf("OSSpinlock: %f sec\n", now-then); id obj = [NSObject new]; then = CFAbsoluteTimeGetCurrent(); for(i=0;i<ITERATIONS;++i){ @synchronized(obj){ } } now = CFAbsoluteTimeGetCurrent(); printf("@synchronized: %f sec\n", now-then); [pool release]; return 0; }
书签