提高代码目标C的处理速度

时间:2012-11-18 02:33:54

标签: objective-c multithreading grand-central-dispatch block database-performance

基本上我的iPhone应用程序中有一个图形视图控制器(实际上有几个)。图表取决于用户对不同“记分卡”的选择。然而,问题是用户可以根据需要选择多个记分卡:他们可以选择数百个。

在生成图表时,我运行了许多算法,并且它们在进入核心数据以提取信息时非常繁重,我的算法的示例如下所示。

-(NSDictionary *) stablefordForEachPersonOnCourse:(NSString *) courseName atDate:(NSString *) date
{

NSDictionary *shotsForEachPersonOnCourse = [[NSDictionary alloc]initWithDictionary:[self shotsForEachPersonOnCourse:courseName atDate:date]];
CoreDataHelper *helper = [[CoreDataHelper alloc]init];
NSMutableDictionary *stablefordWithNames = [[NSMutableDictionary alloc]init];

ScoreCard *card = [helper getScoreCardWithDate:date fromCourse:[helper getGolfCourseWithName: courseName]];

 for (int j = 0 ; j < [[shotsForEachPersonOnCourse allKeys]count]; ++j) {

     Player *player = [helper getPlayerWithName:[[shotsForEachPersonOnCourse allKeys]objectAtIndex:j] fromScoreCard:card];

     NSString *teeColour = player.teePlayed;
     NSArray *arrayOfHolesPlayed = [helper getOrderedArrayOfHolesFromPlayer:player];
     NSArray *arrayOfHoles = [helper getOrderedArrayOfHolesFromTee:[helper getTeeWithColour:teeColour fromCourse:[helper getGolfCourseWithName:courseName]]];
     NSMutableArray *stableFord = [[NSMutableArray alloc]init];

     for (int i = 0; i< [arrayOfHolesPlayed count]; i++) {

         HolePlayed *holePlayed = [arrayOfHolesPlayed objectAtIndex:i];
         Hole *hole = [arrayOfHoles objectAtIndex:i];

         int temp1 = 0, shotsGet = 0;

         int handicap = player.handicap.intValue;
         int strokeIndex = hole.holeSI.intValue;
         int par = hole.holePar.intValue;
         int shotScore = holePlayed.holeScore.intValue;

         if (shotScore >0) {
         while (temp1 >= 0) {

             if(handicap - (strokeIndex + (18*temp1))>= 0)
             {
                 ++shotsGet;
                 ++temp1;
             }
             else temp1 = -1;

         }
         int stableford = (0 - (shotScore - (shotsGet + par))+2);
         if (stableford < 0) {
             stableford = 0;
         }

        [stableFord addObject:[NSNumber numberWithInt:stableford]];
         }
         else if (shotScore <1) [stableFord addObject:[NSNumber numberWithInt:0]];
     }

     [stablefordWithNames setValue:stableFord forKey:[[shotsForEachPersonOnCourse allKeys]objectAtIndex:j]];
     }
return stablefordWithNames;}  

此算法计算特定记分卡上每个人的稳定值。现在,当用户选择许多记分卡时,我需要一种快速提高算法速度的方法。

我把这个问题保持开放 - 但是加速我的代码的最佳方法是什么。显然,使用Grand Central Dispatch(GCD)是必须的,因为这使得代码能够在不同的内核上运行,从而提高每单位时间的处理能力 - 但是在这方面使用GCD的最佳方式是什么?另外,我应该把所有的计算都变成块吗?这会显着提高计算速度吗?

1 个答案:

答案 0 :(得分:3)

  

我把这个问题保持开放 - 但加快代码的最佳方法是什么?

不要在问题上抛出更多线程。你应该首先关注花费最多时间的事情:

  • CPU?
  • I / O? (包括CoreData)
  • 可以使用更好的算法吗?
  • 搜索?排序
  • 创建大量对象?
  • 可以使用C?
  • 轻松表达程序的某些部分

然后将它们尽可能合理地重复(迭代),然后重新评估。如果您尚未优化实现,那么通常从初始实现获得显着增益(例如2x-20x或更多)(同时保持其比并发/多线程实现更易维护)。您可能从多线程中获益,但这应该是您最后的一个度假胜地,特别是如果您的实现不是为并发执行而设计的(不是线程安全的)。

  

显然,使用Grand Central Dispatch(GCD)是必须的.​​.....

制作正确的多线程实现可能会花费大量时间,并且还可能不必要地消耗/引入大量硬件资源需求。即便如此,还有GCD的替代品。

如果您应该在UX的辅助线程上执行工作,那不仅仅是在问题上投入更多线程。