1

基本的に、iPhoneアプリケーションにはグラフビューコントローラー(実際にはいくつか)があります。グラフは、ユーザーが選択したさまざまな「スコアカード」に依存します。ただし、問題は、ユーザーが必要な数のスコアカードを選択できることです。数百を選択できます。

グラフを作成する際に、私は多くのアルゴリズムを実行していますが、それらは情報を抽出するためにコアデータに到達するため、非常に強力です。私のアルゴリズムの1つの例を以下に示します。

-(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を使用する最良の方法は何でしょうか。また、すべての計算をブロックに変換する必要がありますか?これにより、計算速度が大幅に向上しますか?

4

1 に答える 1

3

私はこの質問を完全に自由形式のままにしました-しかし、私のコードをスピードアップするための最良の方法は何ですか?

問題にもっとスレッドを投げることから始めないでください。最も時間がかかっていることに焦点を当てることから始める必要があります。

  • CPU?
  • I / O?(CoreDataを含む)
  • より良いアルゴリズムを使用できますか?
  • 検索しますか?並べ替え?
  • オブジェクトの作成数が多いですか?
  • プログラムの一部はCを使用して簡単に表現できますか?

次に、それらを妥当な範囲でダウンさせ(繰り返し)、再評価します。実装をまだ最適化していない場合は、最初の実装から大幅な向上(たとえば、2倍から20倍以上)を達成するのが一般的です(並行/マルチスレッド実装よりも保守性を維持します)。マルチスレッドの恩恵を受けるかもしれませんが、特に実装が同時実行用に設計されていない(スレッドセーフではない)場合は、それが最後の手段の1つになるはずです。

明らかに、Grand Central Dispatch(GCD)の使用は必須です…</ p>

正しいマルチスレッド実装を作成するには、多くの時間がかかる可能性があり、また、多くのハードウェアリソース要求を不必要に消費/導入する可能性があります。それでも、GCDに代わるものがあります。

UXのセカンダリスレッドで作業を実行する必要がある場合、それは問題でより多くのスレッドをスローするだけではありません。

于 2012-11-18T02:58:55.300 に答える