0

私はそのような方法を持っており、より適切に実行するために最適化するのに苦労しています。NSLog(@"Debug2")と の間を移動するのに、100 単位で約 1 秒、4 回かかりますNSLog(@"Debug3")。iPhoneなら2秒。より多くのユニットでは、より多くの時間がかかります。250 ユニットで 5 倍、Mac では 1.7 秒、iPhone では 3.2 秒かかります。

パフォーマンスはサイクル内のサイクルにあるとは思いません。250 * 5 = 1250 であるため、コンピューターが高速に処理するには大きすぎないはずです。

方法のアイデア:

入力: NSMutableArray times - 時刻 (2012-12-12、2013-01-19) などを含む NSMutableArray objectArray -LogUnitオブジェクトを含む。出力: 計算されたビューの配列。

主なアイデア: 時間が同じである ObjectArray からのオブジェクトを使用した各時間のビュー。

一部のオブジェクトを表示することで高速化しましたが (countedコード内_breakPleaseの および を参照)、まだ十分な速度ではありません。

- (NSMutableArray*) sortViews: (NSMutableArray *)times and:(NSMutableArray *)objectArray
{
    NSLog(@"debug2");
    NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:times.count];

    NSString *number = [NSString stringWithFormat:@"SortLog%i ",[[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"].intValue];

    NSString *comp = [[NSUserDefaults standardUserDefaults] stringForKey:number];

    LogUnit *unit;

    int counted = 0;
    for(int x = 0; x != times.count; x++)
    {
        @autoreleasepool {

        UIView *foo = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];   
        foo.backgroundColor = [UIColor clearColor];

        int f = 0;
        int h = 0;

        NSString *attributeName = @"realTime";
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K IN %@", attributeName, [times objectAtIndex:x]];
        // Filter the objectArray by the time, so we don't have to run through all the objects in objectArray, and check if time is right.
        NSArray *filtered  = [objectArray filteredArrayUsingPredicate:predicate];

        for(int i = 0; i != filtered.count; i++)
        {
                unit = [filtered objectAtIndex:i];

                // Filter units by user choice (comp). Like comp = Warnings or comp = Errors and etc.
                if([[unit status] isEqualToString:comp] || [comp isEqualToString:NULL] || comp == NULL)
                {
                     // testing if the unit is correct to use
                    if([unit getEvent] != NULL)
                    {
                    // below is some computation for frames, to get them to proper position
                        unit.view.frame = CGRectMake(unit.view.frame.origin.x, f * unit.view.frame.size.height + 30, unit.view.frame.size.width, unit.view.frame.size.height);
                        [foo addSubview:unit.view];
                        counted++;
                        f++;
                        h = unit.view.frame.size.height * f;
                    }
                }
        }

        UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 30)];
        myLabel.backgroundColor = [UIColor clearColor];
        myLabel.font = [UIFont boldSystemFontOfSize:20];
        myLabel.textColor = [UIColor colorWithRed:88 green:154 blue:251 alpha:1];
        myLabel.textAlignment = UITextAlignmentCenter;
        myLabel.text = [times objectAtIndex:x];
        // Just adding a label with "2012-12-30" or etc on top of the view.    
        [foo addSubview:myLabel];

        foo.frame = CGRectMake(0,0, 320, h + 30 );
        h = 0;
        [views addObject:foo];

        // counting added views for performance, if more than 30, return, and show only small portion of whole units, user has the option to show all the units if he wants to, but that takes a time to load..
        if(counted > 30 && filtered.count != counted)
        {
            if(_breakPlease == false)
            {
                _broken = true;
                break;
            }
        }
       }
    }
    NSLog(@"debug3");
    return views;
}
4

1 に答える 1

4

あなたが試すいくつかのこと。

最初にプロファイリングを行います:

  • Instruments でプロファイラーを試してください。
  • プロファイラーに恨みがある場合は、コードの各部分の中央値を取得してみてください。

最適化のために:

  • ループ内ですべて同じオブジェクトを作成することから逃げてください。サンプル オブジェクトを作成してから、再利用またはコピーしてみてください。
    • サンプルUIViewを作成してアーカイブし、新しいビューが必要なときはいつでもアーカイブを解除してください。UILabelこれを;にも適用します。
    • 私はそれを使用したことはありませんが、NSPredicate後でいくつかの値を作成して適用する方法があります。このようにして、同じものを再利用できますUIPredicate
    • 必要な色も、どのように処理するUIColorかわからないため、要求するのではなく変数に保存します。UIColor
  • 内部ループを短絡できますか。forつまり、正しいユニットの最大数がありますか?

プロファイラーは、ボトルネックがどこにあるかを理解するのに十分なはずですが、いくつかのアイデアも紹介します。

ここで結果を報告することを忘れないでください!:)

于 2013-01-31T07:53:37.260 に答える