कोड की कल्पना करें:
public class obj
{
// elided
}
public static Dictionary<string, obj> dict = new Dictionary<string, obj>();
विधि 1
public static obj FromDict1(string name)
{
if (dict.ContainsKey(name))
{
return dict[name];
}
return null;
}
विधि 2
public static obj FromDict2(string name)
{
try
{
return dict[name];
}
catch (KeyNotFoundException)
{
return null;
}
}
अगर इन 2 कार्यों के प्रदर्शन में अंतर होता है, तो मैं उत्सुक था, क्योंकि पहले एक SHOULD दूसरे की तुलना में SLOWER होता है - यह देखते हुए कि यह दो बार जांचना आवश्यक है कि क्या शब्दकोश में कोई मान है, जबकि दूसरे फ़ंक्शन को केवल शब्दकोश तक पहुंचने की आवश्यकता है एक बार लेकिन वाह, यह वास्तव में विपरीत है:
1 000 000 मानों के लिए लूप (100 000 मौजूदा और 900 000 गैर मौजूदा के साथ):
पहला कार्य: 306 मिली सेकेंड
दूसरा कार्य: 20483 मिलीसेकंड
ऐसा क्यों है?
संपादित करें: जैसा कि आप इस प्रश्न के नीचे टिप्पणियों में देख सकते हैं, दूसरे फ़ंक्शन का प्रदर्शन वास्तव में पहले वाले की तुलना में थोड़ा बेहतर है, जिसमें 0 मौजूदा मौजूदा कुंजी हैं। लेकिन एक बार कम से कम 1 या अधिक गैर मौजूदा कुंजियों के होने के बाद, दूसरे का प्रदर्शन तेजी से घटता है।
O(1)
शब्दकोश में लुकअप की तुलना में अपवाद को शामिल करने में बहुत अधिक निर्देश शामिल हैं ... विशेष रूप से दो O(1)
ऑपरेशन करने के बाद भी अभी भी asymptotically है O(1)
।
ContainsKey
उम्मीद की जा रही हैO(1)
...