Re: CFMutableDictionary Capacity
Re: CFMutableDictionary Capacity
- Subject: Re: CFMutableDictionary Capacity
- From: Andreas Grosam <email@hidden>
- Date: Thu, 21 Jul 2011 07:09:29 +0200
On Jul 21, 2011, at 12:30 AM, Jens Alfke wrote:
>
> On Jul 20, 2011, at 2:34 PM, Andreas Grosam wrote:
>
>> According the doc, the parameter "capacity" in function CFDictionaryCreateMutable() sets the *maximum number* of key-value pairs which can be inserted into the container. That is, it's not an *initial* capacity.
>
> I think that was a mistake in the docs. The comment in CFDictionary.h in the 10.7 SDK says:
>
> @param capacity A hint about the number of values that will be held
> by the CFDictionary. Pass 0 for no hint. The implementation may
> ignore this hint, or may use it to optimize various
> operations. A dictionary's actual capacity is only limited by
> address space and available memory constraints). If this
> parameter is negative, the behavior is undefined.
>
> Since CFDictionary and NSDictionary have the same implementation under the hood, I think the capacity will have the same effect at runtime whichever API you use.
>
> —Jens
On Jul 21, 2011, at 1:48 AM, Jean-Daniel Dupas wrote:
>
> IIRC, the semantic of the capacity parameter changed in 10.5. Before 10.5, it specified the max capacity and trying to insert more elements was documented as an undefined behavior.
OK, thank you both for the infos. I should have mentioned that I'm compiling with base SDK 10.6 on Mac OS 10.6.8.
Should test this on 10.7 with Base SDK 10.7 as well.
Nonetheless, when defining a mutable dictionary with CF functions, the subsequent insertions take far more time than when using Foundation, e.g.:
CFMutableDictionaryRef o =
#if USE_CF
CFDictionaryCreateMutable(NULL, count,
&kCFTypeDictionaryKeyCallBacks,
&kCFTypeDictionaryValueCallBacks);
#else
CFMutableDictionaryRef([[NSMutableDictionary alloc] initWithCapacity:count]);
#endif
With Instruments I could figure that the CF version takes more time due to additional need for rehashing the container when elements are inserted. This results in a huge difference in the runtime (roughly factor 2.5) for inserting elements , given the fact that the "count" parameter is actually the final number of elements which will be inserted.
So, looking at Instruments profiling a test case (a couple of dictionaries, with a couple of elements) comparing CF to Foundation, the difference are as follows (Mac OS 10.6.8, Base SDK 10.6):
CF version:
197 ms ___CFBasicHashFindBucket1
174 ms __CFBasicHashRehash
377 ms CFDictionaryAddValue
Foundation version:
80 ms ___CFBasicHashFindBucket1
21 ms __CFBasicHashRehash
147 ms CFDictionaryAddValue
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden