2017-02-02 28 views
0

我有一個嵌套for循環。我想使用GCD併發優化它。試過:如何使用dispatch_apply替換GCD的嵌套for循環以獲得最大併發性能

  1. 用gcd_apply替換循環。
  2. 僅替換gcd_apply的inner for循環。

我想得到最後的結果放在沒有改變的順序。

-(NSMutableArray*)getsportNotificationObjectsByGroup{ 
NSMutableArray* notificationObjects = [NSMutableArray array]; 

NSString* defaultNoteValue; 
defaultNoteValue = [WADeviceAndAppSettingPopUpManager getDefaultNoteValueBasedOnSystemAlertButtonAction]; 

for(WACategoryInfo * categoryInfo in self.allSportSCategories){ 
    @autoreleasepool { 

     NSMutableArray *subArray = [[NSMutableArray alloc] init];; 
     for (NSDictionary *dictNotificationTags in categoryInfo.notificationTags) { 
      NSString *tagName, *tagCode; 
      BOOL isTagDefaultEnabled = NO; 
      tagName = [dictNotificationTags objectForKeyWithNullCheck:ktagName]; 
      tagCode = [dictNotificationTags objectForKeyWithNullCheck:ktagCode]; 
      isTagDefaultEnabled = [[dictNotificationTags objectForKeyWithNullCheck:kisTagDefaultEnabled] boolValue]; 

      //********value computation*******// 



      NSString* val = @""; 
      if ([WAConfigLoader sharedInstance].isCollegeStyleApp) { 
       val = [WADeviceAndAppSettingPopUpManager getValueForSwitch:dictNotificationTags]; 

      } 
      //*****value computation*********// 
      NSDictionary *sportDetail = @{ 
              kname:tagName, 
              ktype:kswitch, 
              kid:tagCode, 
              kvalue : val, 
              ksportStringId:categoryInfo.sportStringID, 
              kTitleKey : tagName 
              }; 

      [subArray addObject:sportDetail]; 

     } 

     NSMutableDictionary *aNewDict = [[NSMutableDictionary alloc] init]; 
     [aNewDict setObject:subArray forKey:kdata]; 
     [aNewDict setObject:categoryInfo.sportTitle forKey:ksection]; 
     [notificationObjects addObject:aNewDict]; 
    } 
} 
return notificationObjects; 

}

這不是強制使用僅GCD,我關心的是最大限度地循環性能。

+0

「我想把最後的結果放在一起,不加改變」。那麼,如果你同時做了這些事情,那麼你就無法控制它完成的任務,簡單明瞭。所以,重構你的代碼,以便它沒關係。例如。將結果存儲在字典中,然後返回到原始數組以找出您應該從字典中檢索它們的順序。 – Rob

+0

你說你已經試過派遣申請。所以,不要要求我們再寫一遍,而是要告訴我們你的嘗試。撇開結果的順序,其他情況如何?你獲得了什麼樣的表現收益?如果代碼計算密集程度不夠高,則可能看不到顯着的改進(尤其是在添加必要的開銷以同步結果後)。 – Rob

回答

0

如果更換dispatch_apply內循環,就必須採取這些缺點的關注:

  • 你必須調用同步到[subArray addObject]
  • subArray順序indetermined

因此,我會建議只將外循環放在dispatch_apply工作項目中,因爲它會將結果添加到不提供任何順序的字典中。不過,無論如何,你必須同步[notificationObjects addObject]

只記得將dispatch_apply併發到併發隊列中。