मेरे पास एक शब्दकोश है जिसमें 1000 प्रविष्टियां हैं। प्रविष्टियां प्रकार कुंजी = key XXX
के सभी एनएसएसटींग हैं, और मूल्य = element XXX
जहां XXX
0 के बीच एक संख्या है - तत्वों की संख्या - 1. (कई दिन पहले, मैंने एक शब्दकोश युक्त उद्देश्य-सी शब्दकोशों के बारे में पूछा था। कृपया refer to that question आप उस कोड को चाहते हैं जो शब्दकोश बनाता है।)उद्देश्य-सी: ब्लॉक और एनएसईएन्यूमरेशन के साथ समस्याएंकंक्रंट
उप शब्दकोश में सभी तारों की कुल लंबाई 28,670 वर्ण है। अर्थात्:
strlen("key 0")+strlen("element 0")+
//and so on up through
strlen("key 999")+strlen("element 999") == 28670.
इस एक संकेतक के रूप एक बहुत ही सरल हैश मान यदि एक विधि एक बार और केवल एक बार हर कुंजी + मान युग्म प्रगणित गया है पर विचार करें। अगर मैं (एक बहु प्रोसेसर मशीन पर) समवर्ती ब्लॉकों एक ही उपयोग करने का प्रयास
NSUInteger KVC_access3(NSMutableDictionary *dict){
__block NSUInteger ll=0;
NSMutableDictionary *subDict=[dict objectForKey:@"dict_key"];
[subDict
enumerateKeysAndObjectsUsingBlock:
^(id key, id object, BOOL *stop) {
ll+=[object length];
ll+=[key length];
}];
return ll;
}
// will correctly return the expected length...
, मैं एक मिल:
मैं एक सबरूटीन कि पूरी तरह से काम करता है (ब्लॉकों का उपयोग कर) अलग-अलग शब्दकोश कुंजी और मान का उपयोग करना संख्या करीब नहीं बल्कि वास्तव में उम्मीद 28670:
NSUInteger KVC_access4(NSMutableDictionary *dict){
__block NSUInteger ll=0;
NSMutableDictionary *subDict=[dict objectForKey:@"dict_key"];
[subDict
enumerateKeysAndObjectsWithOptions:
NSEnumerationConcurrent
usingBlock:
^(id key, id object, BOOL *stop) {
ll+=[object length];
ll+=[key length];
}];
return ll;
}
// will return correct value sometimes; a shortfall value most of the time...
NSEnumerationConcurrent
राज्य के लिए एप्पल डॉक्स:
"the code of the Block must be safe against concurrent invocation."
मुझे लगता है कि शायद यह मुद्दा है, लेकिन मेरे कोड या ब्लॉक के साथ समस्या क्या है KVC_access4
जो समवर्ती आमंत्रण के लिए सुरक्षित नहीं है?
संपादित & निष्कर्ष
बी.जे. होमर के excellent solution के लिए धन्यवाद, मैं NSEnumerationConcurrent काम कर गया। मैंने दोनों विधियों को बड़े पैमाने पर समय दिया। मेरे पास KVC_access3
में जो कोड है, वह छोटे और मध्यम आकार के शब्दकोशों के लिए तेज़ और आसान है। बहुत सारे शब्दकोशों पर यह बहुत तेज है। हालांकि, अगर आप तो इस कोड को एक मोंगो बड़ा शब्दकोश (दस लाख या कुंजी/मान जोड़े करोड़ों) है:
[subDict
enumerateKeysAndObjectsWithOptions:
NSEnumerationConcurrent
usingBlock:
^(id key, id object, BOOL *stop) {
NSUInteger workingLength = [object length];
workingLength += [key length];
OSAtomicAdd64Barrier(workingLength, &ll);
}];
तेजी 4x तक है। आकार के लिए पारदर्शी बिंदु मेरे परीक्षण तत्वों में से 100,000 का लगभग 1 शब्दकोश है। सेट-अप समय के कारण अधिक शब्दकोश और वह क्रॉसओवर पॉइंट संभवतः अधिक है।