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