0

これは iOS プロジェクト用です。速度の最適化のために、入れ子になった NSMutableArray ではなく 2D C 配列を使用するように、dataController のセクションを作り直しています。配列のさまざまなセクションで何千もの整数加算演算を実行する必要があることがわかりましたが、オブジェクト モデルはかなり遅いです。

私の配列の次元は現在 710 x 55 で、710 の数値は動的です。同じサイズの配列が他に 5 つあり、将来的にはさらに増える可能性があるため、NSArray を避ける必要があります。

ソース全体を投稿するつもりはないので、関連する部分だけを投稿します。

@implementation MMEventDataController

int **wbOcMatrix = NULL;
int numEvents = 0;

-(void)generateMatrix {

for (NSDictionary *item in JSONData) {

{...}
// Here I parse some JSON data and bring part of it into newEvents.wb which is an
// NSMutableArray of ints. These can be ints 1 thru 55, which represent various
// flags that can be set. Only 5 flags will be inside each newEvent.wb. 
{...}

// Create some empty C arrays. This part is probably where I go wrong.

    wbOcMatrix = (int **) realloc (wbOcMatrix, (numEvents+1) * sizeof(int *));

    wbOcMatrix[numEvents] = malloc (55 * sizeof(int));

    int wbOcArray[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};


// Here we find which 5 flags are set in newEvent.wb and set the corresponding index of
// wbOcArray to 1.

    for (id object in newEvent.wb) {

        int v = wbOcArray[[object intValue]-1];
        v++;
        wbOcArray[[object intValue] -1] = v;
        }

// Then we bring the new wbOcArray into the next index of the wbOcMatrix and increment.

    wbOcMatrix[numEvents] = wbOcArray;
    numEvents++;

}

// This process repeats for all items in the JSON data, at the moment is 710, thus
// creating an array 710 x 55.

2D 配列は適切に作成されているようです。つまり、データを含む適切なサイズの配列がありますが、配列の各行には同じデータが含まれています。そして、そのデータは反復 710 からのものです。

私の疑惑は、私の配列はポインターの配列であるため、各反復が元のポインターのデータを変更しており、すべての行が同じ場所を指しているということです。では、反復ごとに新しいメモリ領域を割り当てるにはどうすればよいでしょうか? それがmallocの目的だと思いました...

4

1 に答える 1

0

あなたの問題はここにあります:

int wbOcArray[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

これは、ループが終了すると自動的に解放されます。上記の行の直後に a を置くNSLog(@"%p", wbOcArray);と、常に同じアドレスを指していることがわかります。

この行を次のように置き換えます。

int* wbOcArray = (int*)malloc(sizeof(int)*55);
for(int i = 0; i < 55; i++) wbOcArray[i] = 0;

ベスト、クリスチャン

于 2012-05-20T11:03:59.170 に答える