cocoa - NSMutableArray initWithCapacity الفروق الدقيقة




performance (2)

إذا كان أي مساحة تهدر من خلال إعطاء قدرة كبيرة للغاية هي في الواقع تفصيلات التنفيذ التي لا تكتشفها أبل عمدا ، على ما أعتقد. NSMutableArray هو مجموعة فئة مما يعني أنك لا تحصل بالفعل على مثيل من NSMutableArray ولكن بعض الفئة المتخصصة الأخرى تتبع نفس الواجهة. ولا تخبرك Apple بالطبقة التي يتم إرجاعها في هذه الحالة وكيف تتصرف. لذلك من الصعب تقديم نصائح حقيقية هنا.

إذا كنت تعلم حقاً أنه في المتوسط ​​ستحتاج إلى سعة X ، فقط استخدمه. خلاف ذلك ، إلا إذا كان لديك مشاكل في الأداء لا يهمني القدرة على الإطلاق ومجرد استخدام [NSMutableArray array] ...

هل لديها نصيحة حول كيفية تهيئة NSMutableArray على أفضل وجه عندما يتعلق الأمر بإملاء القدرة؟ تشير الوثائق إلى أن ... "حتى لو قمت بتحديد حجم عند تكوين مصفوفة ، فإن الحجم المحدد يعتبر" تلميحًا "؛ ولا يزال الحجم الفعلي للصفيف 0." وبالتالي...

1) إذا بدأت باستخدام سعة أكبر مما أستخدمه عادةً ، فهل لا داعي للقلق بشأن الذاكرة الضائعة؟

2) إذا بدأت باستخدام سعة أقل عادة من ما أستخدمه ، فهل يجب علي القلق بشأن وقت المعالجة الأثقل الذي يخصص المزيد من الذاكرة لاحتواء العناصر الإضافية؟

ما مدى تأثير هذه القدرة المبدئية على استخدام الأداء / الذاكرة لنوع البيانات هذا؟


كتب مات غالاغر مقالًا مفيدًا عن حصص جمع الكاكاو ، بالإضافة إلى بضعة معايير (مع وبدون initWithCapacity: ، بالإضافة إلى مقارنات بين الطبقات)

http://cocoawithlove.com/2008/08/nsarray-or-nsset-nsdictionary-or.html

استغرق اختباره (المصدر متاح) ل NSMutableArray من طول 1،000،000 0.582256sec بدون سعة و 0.572139sec فقط مع القدرة .

Test                                       | Time
[NSMutableArray array]                     | 0.582256 seconds
[NSMutableArray arrayWithCapacity:1000000] | 0.572139 seconds
Iterating contents                         | 0.004713 seconds

أود أن أقول أنه في 99 ٪ من حالات الاستخدام [NSMutableArray array] هو على ما يرام. إذا كنت تعرف الحجم الفعلي للمصفوفة الناتجة ، لن يؤثر ذلك على استخدام [NSMutableArray arrayWithCapacity:] .

ثم هناك هذه المقالة بيتر Ammon (الذي هو المطور على فريق أبل / مؤسسة التأسيس ) يضم العديد من النقاط المرجعية الثاقبة:

http://ridiculousfish.com/blog/archives/2005/12/23/array/

تحرير (12 مارس 2012):

مزيد من الإحصاءات حول أداء تهيئة المصفوفة من http://darkdust.net/writings/objective-c/nsarray-enumeration-performance

[…] أنا [=> DarkDust] أردت أيضًا معرفة ما إذا كان الأداء مختلفًا أم لا اعتمادًا على كيفية إنشاء الصفيف. اختبرت طريقتين مختلفتين:

  • إنشاء مصفوفة C التي تشير إلى مثيلات الكائن وإنشاء الصفيف باستخدام initWithObjects:count:
  • إنشاء NSMutableArray ثم إضافة كائنات باستخدام addObject:

[…] هناك فرق عند التخصيص: initWithObjects:count: الطريقة أسرع . مع عدد كبير جدًا من الكائنات ، يمكن أن يصبح هذا الاختلاف هامًا .

تحرير (6 مارس 2014):

مزيد من المعلومات حول أداء تهيئة المصفوفة من http://ciechanowski.me/blog/2014/03/05/exposing-nsmutablearray/ :

دعونا نخصص صفائف جديدة مع القدرة الأولية المحددة لسلطات متتالية من اثنين:

for (int i = 0; i < 16; i++) {
    NSLog(@"%@", [[[NSMutableArray alloc] initWithCapacity:1 << i] explored_description]);
}

يا للمفاجئة:

size:  2 // requested capacity:   1
size:  2 // requested capacity:   2
size:  4 // requested capacity:   4
size:  8 // requested capacity:   8
size: 16 // requested capacity:  16
size: 16 // requested capacity:  32
size: 16 // requested capacity:  64
size: 16 // requested capacity: 128
...
// 'size: 16' all the way down





capacity