1

私は作業中のコードを持っており、より多くのデータが渡されるとかなりロードされるため、これからパフォーマンスを向上させたいと考えています。しかし、私はそれについて他に何ができるかわかりません。

入力: logUnits の配列。それぞれに "2013-01-16 15:13:00 Hello" のようなログ イベントのビューと時刻の配列が含まれます。この配列には、ログ イベント (2013-01-02,2013) がある時刻のみが含まれます。 -01-09 など)

出力: 各ビューに同じ日のログ ユニットが含まれるビューの配列。

また、ログ ユニットをイベント タイプでフィルタリングする必要がある場合もあります。

これが私がこれをした方法です。

 NSMutableArray *views = [[NSMutableArray alloc] initWithCapacity:times.count];
    @autoreleasepool {

        for(int x = 0; x != times.count; x++)
        {
            UIView *foo = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];
            foo.backgroundColor = [UIColor clearColor];
            int f = 0;
            int h = 0;

            for(int i = 0; i != objectArray.count; i++)
            {
                @autoreleasepool
                {

                    LogUnit *unit = [objectArray objectAtIndex:i];
                    if([[times objectAtIndex:x] isEqual:[unit realTime]]) 
                    {

                        if(![[foo subviews] containsObject:unit.view]) // Look if unit was already added
                        {
                            NSString *number = [NSString stringWithFormat:@"SortLog%i ",[[NSUserDefaults standardUserDefaults] stringForKey:@"ObjectNumber"].intValue];
                            NSString *comp = [[NSUserDefaults standardUserDefaults] stringForKey:number];

                            if([[unit status] isEqualToString:comp] || [comp isEqualToString:NULL] || comp == NULL)
                            {
                                if([unit getEvent] != NULL)
                                {
                                    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];
                                    f++;
                                    h = unit.view.frame.size.height * f;
                                }
                            }
                        }
                    }
                }
            }

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

これで最悪のことはループインループであり、外側のループごとにすべてのlogUnitを再実行する必要があると思います。しかし、他にどのようにこれを行うことができるかわかりません。「時間が等しい[単位リアルタイム]の選択単位」のような呼び出し方があるかもしれません。

4

1 に答える 1

0

ここにはいくつかの危険信号があります。一番手っ取り早いのは、unit.view の foo のすべてのサブビューをスキャンすることです。これは O(n) 操作であり、最も内側のループで実際に問題が発生します。

次に、両方の配列を時間でソートすると、同じサイズのイベントを見つけるために二重ループを実行する必要はありません。マージソートでそれがどのように行われるかを見てください。

それでも十分でない場合は、すべての比較作業をサイド スレッドで実行し、サブビューの追加とビューの作成プロセスのみをメイン スレッドにディスパッチすることを検討してください。少なくとも、はるかに高速に見えるようになります。

于 2013-01-18T08:46:36.503 に答える