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 protected])
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:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]