2012-04-20 79 views
3

我有一個無限循環驅動我的工作線程。NSRunLoop消耗了大量的CPU和內存

-(void) myThread 
{ 
    NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init]; 
    while(![myThread isCancelled]) 
    { 
     [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:600]]; 
    } 
    [pool release]; 
} 

但有時這些線程需要太多的CPU(50-100%)和內存(1.5GB)。當我在這種狀態下采樣應用程序時,我得到以下跟蹤

453 +[NSDate dateWithTimeIntervalSinceNow:] 
      309 -[__NSPlaceholderDate initWithTimeIntervalSinceReferenceDate:] 
      295 CFDateCreate 
       268 _CFRuntimeCreateInstance 
       115 malloc_zone_malloc 
        64 __spin_lock 
        64 __spin_lock 
        43 szone_malloc 
        22 tiny_malloc_from_free_list 
         22 tiny_malloc_from_free_list 
        19 szone_malloc 
        2 spin_unlock 
         2 spin_unlock 
        4 malloc_zone_malloc 
        3 dyld_stub__spin_unlock 
        3 dyld_stub__spin_unlock 
        1 dyld_stub__spin_lock 
        1 dyld_stub__spin_lock 
       99 __bzero 
        99 __bzero 
       29 malloc_size 
        23 szone_size 
        23 szone_size 
        6 malloc_size 
       13 CFAllocatorAllocate 
        13 CFAllocatorAllocate 
       12 _CFRuntimeCreateInstance 
       20 CFDateCreate 
       4 CFDateGetTypeID 
       4 CFDateGetTypeID 
       3 memset 
       3 memset 
      14 -[__NSPlaceholderDate initWithTimeIntervalSinceReferenceDate:] 
      60 CFAbsoluteTimeGetCurrent 
      48 gettimeofday 
       38 __gettimeofday 
       21 __nanotime 
        21 __nanotime 
       17 __gettimeofday 
       10 gettimeofday 
      11 CFAbsoluteTimeGetCurrent 
      1 __gettimeofday 
       1 __gettimeofday 
      47 +[NSObject alloc] 
      25 objc_msgSend 
       25 objc_msgSend 
      11 +[NSDate allocWithZone:] 
       8 +[NSObject self] 
       8 +[NSObject self] 
       3 +[NSDate allocWithZone:] 
      7 +[NSObject alloc] 
      2 +[__NSPlaceholderDate immutablePlaceholder] 
       2 +[__NSPlaceholderDate immutablePlaceholder] 
      2 dyld_stub_objc_msgSend 
       2 dyld_stub_objc_msgSend 
      24 +[NSDate dateWithTimeIntervalSinceNow:] 
      7 objc_msgSend 
      7 objc_msgSend 
      4 CFMakeCollectable 
      4 CFMakeCollectable 
      1 dyld_stub_gettimeofday 
      1 dyld_stub_gettimeofday 
      1 dyld_stub_objc_msgSend 
      1 dyld_stub_objc_msgSend 
     354 -[NSRunLoop(NSRunLoop) runUntilDate:] 
      307 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] 
      153 _CFRunLoopFinished 
       125 __CFRunLoopFindMode 
       110 CFSetGetValue 
        85 __CFSetFindBuckets1b 
        36 __CFSetFindBuckets1b 
        17 CFEqual 
         9 __CFRunLoopModeEqual 
         7 CFEqual 
          7 CFEqual 
         2 __CFRunLoopModeEqual 
         8 CFEqual 
        16 __CFStringHash 
         16 __CFStringHash 
        12 _CFHash 
         12 _CFHash 
        3 CFHash 
         3 CFHash 
        1 __CFRunLoopModeHash 
         1 __CFRunLoopModeHash 
        24 CFSetGetValue 
        1 CFEqual 
        1 CFEqual 
       14 __CFRunLoopFindMode 
       1 _CFRuntimeSetInstanceTypeID 
        1 _CFRuntimeSetInstanceTypeID 
       12 _CFRunLoopFinished 
       9 __CFRunLoopModeIsEmpty 
       8 CFSetGetCount 
        8 CFSetGetCount 
       1 __CFRunLoopModeIsEmpty 
       6 __spin_lock 
       6 __spin_lock 
       1 spin_unlock 
       1 spin_unlock 
      82 -[NSCFString isEqual:] 
       23 -[NSCFString isEqual:] 
       22 objc_msgSend 
       22 objc_msgSend 
       17 CFStringGetLength 
       17 CFStringGetLength 
       9 CFStringGetCStringPtr 
       9 CFStringGetCStringPtr 
       6 NSClassFromObject 
       2 -[NSObject class] 
        2 -[NSObject class] 
       2 NSClassFromObject 
       2 object_getClass 
        2 object_getClass 
       3 object_getClass 
       3 object_getClass 
       1 dyld_stub_objc_msgSend 
       1 dyld_stub_objc_msgSend 
       1 dyld_stub_object_getClass 
       1 dyld_stub_object_getClass 
      37 _CFRunLoop0 
       16 _CFRunLoop0 
       12 CFDictionaryGetValue 
       10 __CFDictionaryFindBuckets1a 
        10 __CFDictionaryFindBuckets1a 
       2 CFDictionaryGetValue 
       8 pthread_main_np 
       8 pthread_main_np 
       1 spin_unlock 
       1 spin_unlock 
      12 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] 
      11 __spin_lock 
       11 __spin_lock 
      6 dyld_stub_OSSpinLockUnlock 
       6 dyld_stub_OSSpinLockUnlock 
      3 CFRunLoopGetCurrent 
       3 CFRunLoopGetCurrent 
      1 dyld_stub_CFStringGetCStringPtr 
       1 dyld_stub_CFStringGetCStringPtr 
      1 dyld_stub_pthread_self 
       1 dyld_stub_pthread_self 
      1 spin_unlock 
       1 spin_unlock 
      25 -[__NSCFDate retain] 
      15 OSAtomicCompareAndSwapLongBarrier 
       8 __compare_and_swap32 
       8 __compare_and_swap32 
       7 OSAtomicCompareAndSwapLongBarrier 
      4 -[__NSCFDate retain] 
      4 _CFRetain 
       4 _CFRetain 
      1 CFRetain 
       1 CFRetain 
      1 __compare_and_swap32 
       1 __compare_and_swap32 
      14 -[NSRunLoop(NSRunLoop) runUntilDate:] 
      7 objc_msgSend 
      7 objc_msgSend 
      1 dyld_stub__CFRunLoopFinished 
      1 dyld_stub__CFRunLoopFinished 
     51 objc_msgSend 
      51 objc_msgSend 
     39 -[NSObject(NSObject) autorelease] 
      28 __NSAutoreleaseObject 
      24 __NSAutoreleaseObject 
      4 _NSAPAddPage 
       2 _NSAPAddPage 
       2 malloc 
       2 malloc_zone_malloc 
        2 szone_malloc 
        2 small_malloc_from_free_list 
         1 small_free_list_add_ptr 
         1 small_free_list_add_ptr 
         1 small_malloc_from_free_list 
      8 NSAutoreleaseObject 
      7 NSAutoreleaseObject 
      1 objc_collecting_enabled 
       1 objc_collecting_enabled 
      1 -[NSObject(NSObject) autorelease] 
      1 dyld_stub_pthread_getspecific 
      1 dyld_stub_pthread_getspecific 
      1 pthread_getspecific 
      1 pthread_getspecific 
     19 +[NSRunLoop(NSRunLoop) currentRunLoop] 
      14 +[NSThread currentThread] 
      13 +[NSThread currentThread] 
      1 pthread_getspecific 
       1 pthread_getspecific 
      3 +[NSRunLoop(NSRunLoop) currentRunLoop] 
      1 dyld_stub_pthread_getspecific 
      1 dyld_stub_pthread_getspecific 
      1 pthread_getspecific 
      1 pthread_getspecific 
     14 -[NSThread _rl] 
      14 -[NSThread _rl] 
     13 -[MessageSendingModule startSender] 
     12 -[NSThread isCancelled] 
      12 -[NSThread isCancelled] 
     9 OSAtomicCompareAndSwapLongBarrier 
      5 OSAtomicCompareAndSwapLongBarrier 
      4 __compare_and_swap32 
      4 __compare_and_swap32 
     6 CFRelease 
      6 CFRelease 
     6 _CFRelease 
      6 _CFRelease 
     1 -[__NSCFDate release] 
      1 -[__NSCFDate release] 
     1 NSAutoreleaseObject 
      1 NSAutoreleaseObject 
     1 dyld_stub_objc_msgSend 
      1 dyld_stub_objc_msgSend 
     115 objc_msgSend 
     115 objc_msgSend 
     4 dyld_stub_objc_msgSend 
     4 dyld_stub_objc_msgSend 
     1 CFRelease 
     1 CFRelease 

任何人都可以請我幫忙嗎?

+0

它在我看來就像你只是發送太多的工作。 – 2012-04-20 11:42:47

回答

7

空的runloop(沒有任何輸入源或定時器的runloop)將立即從runUntilDate:返回。

如果你想保持線程和服務它的runloop,你可以添加一個計時器到runloop。

是否有任何理由你沒有使用libdispatch進行線程調度?這將避免管理線程和runloop自身的麻煩。

+0

保持線程活着,我使用while循環。我不知道很多關於libdispatch? – 2012-04-20 11:46:20

+0

我正在使用這些線程進行進程間通信。 – 2012-04-20 11:49:32

+2

+1爲空runloop的事情。正如所實施的,這只是一個緊密的while循環。 – JeremyP 2012-04-20 12:48:54