2012-04-20 15 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

あなたはあまりにも多くの仕事を送っているように見えます。 –

答えて

7

空のrunloop(入力ソースやタイマーがないrunloop)は、すぐにrunUntilDate:から戻ってきます。

スレッドを周りに保ち、runloopに対応したい場合は、runloopにタイマーを追加するだけです。

スレッドディスパッチにlibdispatchを使用していない理由はありますか?これは、スレッドを管理し、自分自身をrunloopのトラブルを避けるでしょう。

+0

スレッドを生かしておくために、whileループを使用しています。私はlibdispatchについてよく知らないのですか? –

+0

私はこれらのスレッドをプロセス間通信に使用しています。 –

+2

空のrunloopのものは+1。実装されているように、これはちょっとしたループです。 – JeremyP

関連する問題