2017-12-21 4 views
0

は私が配列構築し、返すメソッドがあります。のObjective-C:@ []との違いは何[[NSArrayのアロケーション] initWithCapacity:0]

- (NSArray *)foo 
{ 
    NSUInteger capacity = [self getArrayCapacity]; 
    if (capacity == 0) { 
     return @[]; 
    } else { 
     NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:capacity]; 
     // add elements to the array, as many as capacity 
     ... 
     return array; 
    } 
} 

を使用しているメモリに差がありますかパフォーマンス次のように私は、コードを簡略化する場合:

​​

ときcapacity == 0代わり@[]を返すので、それは[[NSMutableArray alloc] initWithCapacity:0]

は番目です戻ってきますパフォーマンスやメモリのペナルティ/違い?

+0

をテストすることができませんか?あなたは100万回のループでそれを呼び出すことができ、スピードが2で異なるかどうかを見ることができます。インストゥルメントを使用してメモリサイズに違いがあるかどうかを調べることができます。また、即時構文は可変または不変のインスタンスを作成しますか?ドキュメントの私の読書は、不変の創作のみを示しています。 – user1118321

+0

getterの前に 'get'を付けないでください(objcは一般的に' get'接頭辞を使いません)。 – bbum

答えて

1
[[NSMutableArray alloc] initWithCapacity:0] 

これにより、変更可能な配列が作成され、指定された数の要素を保持するのに十分なメモリが割り当てられます。したがって、実装によっては十分な数のメモリが割り当てられます。

@[] 

は、あなたがそれを作成するたびに同じインスタンスである__NSArray0クラスのインスタンスを返すために最適化されたので、この場合には、余分なメモリ割り当てはありません。

したがって、@[]を使用する方が最適ですが、この機能を非常に頻繁に呼び出さない限り、実際の違いは表示されません。

のiOSシミュレータで、いくつかのベンチマークを実行している:あなたは自分で

NSLog(@"%llu", dispatch_benchmark(100, ^{ 
    for (int i = 0; i < 1000000; ++i) { 
     NSArray *a = @[]; 
    } 
    })); 

NSLog(@"%llu", dispatch_benchmark(100, ^{ 
    for (int i = 0; i < 1000000; ++i) { 
     NSArray *a = [[NSMutableArray alloc] initWithCapacity:0]; 
    } 
    })); 


Array Literal: 9835575 ns 
Mutable Array: 157169503 ns 
+3

マイナーポイント; 'initWithCapacity:'は必ずしもスペースをあらかじめ割り当てるわけではありません。それは、メモリーが潜在的に最適に管理される方法を変更可能な配列に示唆するだけです。 – bbum

関連する問題