@autoreleasepoolとループ

3220 ワード

テストコード1:
//  

size_t count = 10;



//  

NSUInteger objectCount = 10000000;



//  1 - @autoreleasepool 

//  for release 

//  , 480M, 10780423522 

uint64_t time1 = dispatch_benchmark(count, ^{

    @autoreleasepool {

        for (NSUInteger i = 0; i < objectCount; ++i) {

            [NSString stringWithFormat:@"str - %lu", (unsigned long)i];

        }

    }

});

NSLog(@"@autoreleasepool { for { } } = %llu ns", time1);

テストコード2:
//  

size_t count = 10;



//  

NSUInteger objectCount = 10000000;



//  2 - @autoreleasepool 

//  @autoreleasepool release 

//  , 16M, 9902072437 

uint64_t time2 = dispatch_benchmark(count, ^{

    for (NSUInteger i = 0; i < objectCount; ++i) {

        @autoreleasepool {

            [NSString stringWithFormat:@"str - %lu", (unsigned long)i];

        }

    }

});

NSLog(@"for { @autoreleasepool { } } = %llu ns", time2);

まとめ:
Appleドキュメントの推奨によれば、1つのサイクルで大量の一時オブジェクトが生成された場合、サイクル内に自動リリースプールを提供して次の反復を行うことで、これらのオブジェクトをクリアし、最大メモリ消費量を削減できます.
テストコード2は、この場合@autoreleasepoolコードブロックの正しい使用方法、すなわちループ内部に配置することを示す.
対照的なテストでは、@autoreleasepoolコードブロックをループの内部に置くことは、ループの外部に置くよりも性能が低くなく、実際には2つの状況で効率が大きく異なることが明らかになった.しかし、テストコード2のプレゼンテーションの符号化方式だけが正しい.