1

ブロックの繰り返しは列挙よりも速いと思いましたが、場合によってはそうです。ただし、データ配列があり、さまざまな反復アプローチを使用して複数の配列を作成しているこの単純な例では、結果は期待したものではありません。

説明があれば助かります。

NSMutableArray *dataArray =[[[NSMutableArray alloc] init] autorelease];
NSMutableArray *mArray1 = [[[NSMutableArray alloc] init] autorelease];
NSMutableArray *mArray2 = [[[NSMutableArray alloc] init] autorelease];
NSMutableArray *mArray3 = [[[NSMutableArray alloc] init] autorelease];

NSDate *dt1 = [NSDate date];
for (int j=0; j<10000000;j++)
{
    [dataArray addObject:[NSNumber numberWithInt:j]];
}

NSDate *dt2 = [NSDate date];
int cnt = [dataArray count];
//Using normal for loop
for (int k=0; k<cnt;k++)
{
    [mArray1 addObject:[dataArray objectAtIndex:k]];
}

//Using Fast Enumeration
NSDate *dt3 = [NSDate date];
for (NSNumber *num in dataArray)
{
    [mArray2 addObject:num];
}


//Enumerating using Blocks
NSDate *dt4 = [NSDate date];
[dataArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    [mArray3 addObject:obj];
}];
NSDate *dt5 = [NSDate date];

NSLog(@"Time taken to create the data array %f",[dt2 timeIntervalSinceDate:dt1]);
NSLog(@"Time taken to iterate using normal for loop %f",[dt3 timeIntervalSinceDate:dt2]);
NSLog(@"Time taken to iterate using fast enumeration %f",[dt4 timeIntervalSinceDate:dt3]);
NSLog(@"Time taken to iterate using blocks %f",[dt5 timeIntervalSinceDate:dt4]);

//データ配列の作成にかかった時間 0.383750

// 通常のループ 0.309719 を使用して反復するのにかかった時間

//高速列挙を使用して反復するのにかかった時間 0.278467

//ブロックを使用して反復するのにかかった時間 0.526629

4

3 に答える 3

0

gimpycpuが言ったように、ブロックの同時列挙を使用すると、ブロックで列挙することのパフォーマンスへの影響が見られます。GCD を利用し、(スレッド セーフなデータ セットで) さまざまなスレッドを列挙することは、おそらくあなたが望んでいたことです。

サンプル列挙

グラフ・解説:実績

テスト / コード サンプル :コード


同時実行性が問題になる場合は、パフォーマンスを大幅に向上させるために二分探索を試みることを検討してください。

  • ソートされたNSArrayが必要です。
于 2014-08-29T09:09:22.500 に答える
0

生成されたアセンブリを分析せずに確認できた唯一の理由は、次のとおりです。

ブロックの呼び出しには、他のループ メソッドと比較してオーバーヘッドがあります。

また、代わりに試すこともenumerateObjectsWithOptions:NSEnumerationConcurrentできます。実際には、並列化できるため、高速ループよりも高速になる可能性があります。

ブロック内で同期されたものを使用すると、高速にならないことに注意してください(NSArrayただし、同期されているかどうかはわかりません)

于 2014-04-22T18:35:25.580 に答える