Hatena::Groupiphone-dev

iOS プログラミングメモ

2010-03-24 (Wed)

autorelease は遅いか速いか 16:03  autorelease は遅いか速いか - iOS プログラミングメモ を含むブックマーク

以下を見て、ちょっと気になったので自分でも検証してみた。

autorelease の方は、開放してないから速いんじゃないかなあと思ったので、以下のように。

#import <Foundation/Foundation.h>

// Inteface
@interface Man : NSObject
{
   @private
      NSUInteger age_;
}
@property (nonatomic, assign) NSUInteger age;
@end

// Implementation
@implementation Man
@synthesize age = age_;
@end
void test_release() {
   NSDate* start = [NSDate date];

   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   for ( int i = 0; i < 100; ++i ){
      for ( int l = 0; l < 1000; ++l ){
         Man* hoge = [[Man alloc] init];
         hoge.age = l * i;
         [hoge release];
      }
   }
   [pool drain];

   NSLog( @"%f", [start timeIntervalSinceNow] * -1 );
}

void test_autorelease() {
   NSDate* start = [NSDate date];

   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
   for ( int i = 0; i < 100; ++i ){
      for ( int l = 0; l < 1000; ++l ){
         Man* hoge = [[[Man alloc] init] autorelease];
         hoge.age = l * i;
      }
   }
   [pool drain];

   NSLog( @"%f", [start timeIntervalSinceNow] * -1 );
}

int main (int argc, const char * argv[]) {

   NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

   test_release();
   test_autorelease();

   [pool drain];
   return 0;
}

結果。

releaseautorelease
1回目0.0427110.068670
2回目0.0419540.066905
3回目0.0403510.066315

AutoreleasePool を作らなかった場合は tokorom さんの所と同じように autorelease の方が速い。

releaseautorelease
1回目0.0405390.034647
2回目0.0415910.034622
3回目0.0400150.034726

autorelease の開放タイミングって、メインなスレッドの処理が終わった後?でしたっけ。この結果を見る感じ、autorelease を多用してると、開放の瞬間に負荷が集中しちゃうような気がするんですけど、どうなんでしょうか。詳しい人。

tokoromtokorom2010/03/24 18:14おー、有用な実測が増えてきますねー^^
ぼくもAutoreleasePoolを含めて実測してそちらのほうが遅くなっているのを確認しました。
AutoreleasePoolでreleaseを発動する頻度をあげると極端に遅くなるので、今のところAutoreleasePoolの作成と解放に時間がかかっているように思えます。
ここからはまだ未計測なのですが、都度releaseよりも、まとめてrelease(autorelease)のほうが、解放処理自体にかかる時間は短くなるような気がします。そういった意味で、autoreleaseが遅くなるのは、paellaさんからコメントいただいた「オブジェクトが大量にプールされているときに、イベントごとに数え上げの対象になってしまい、数え上げの処理が遅くなってしまう」の部分くらいしか思い当たらないのが現状です。そのあたり、突っ込んで調査してみたいなと思ってます。

ktakayamaktakayama2010/03/24 19:05僕もたっぷり突っ込まれましたw
なんだか難しくなってきたので、皆さんの活躍に期待します

tokoromtokorom2010/03/24 20:21たしかに予想以上に深く突っ込んでいけそうで楽しみです!こうやってブログで連携して調査していけるのはいいですねー^^
ひとまず元記事のほうに、都度releaseとまとめてreleaseの実測結果だけ追記させていただきましたー。

khirohiskhirohis2010/03/24 23:58autorelease が遅いって話自体が初耳だったのですがその差は NSAutoreleasePool による retain となんらかのデータ構造を使ったオブジェクト管理のコスト分だけだと思いますよ

khirohiskhirohis2010/03/25 00:14あー、確認したら retain はしないようですね。お詫びと訂正&連投すいません