किसी कारण से, HashSet
पर Add
ऑपरेशन Contains
ऑपरेशन से धीमा है जब तत्व पहले से ही HashSet
में मौजूद है।हैशसेट प्रदर्शन मौजूदा तत्वों के लिए बनाम बनाम
Stopwatch watch = new Stopwatch();
int size = 10000;
int iterations = 10000;
var s = new HashSet<int>();
for (int i = 0; i < size; i++) {
s.Add(i);
}
Console.WriteLine(watch.Time(() =>
{
for (int i = 0; i < size; i++) {
s.Add(i);
}
}, iterations));
s = new HashSet<int>();
for (int i = 0; i < size; i++) {
s.Add(i);
}
// outputs: 47,074,764
Console.WriteLine(watch.Time(() =>
{
for (int i = 0; i < size; i++) {
if (!s.Contains(i))
s.Add(i);
}
}, iterations));
// outputs: 41,125,219
क्यों Contains
तेजी Add
से पहले ही से मौजूद तत्वों के लिए है:
यहाँ सबूत है?
नोट: मैं इस Stopwatch
एक्सटेंशन को किसी अन्य SO प्रश्न से उपयोग कर रहा हूं।
public static long Time(this Stopwatch sw, Action action, int iterations) {
sw.Reset();
sw.Start();
for (int i = 0; i < iterations; i++) {
action();
}
sw.Stop();
return sw.ElapsedTicks;
}
अद्यतन: आंतरिक परीक्षण से पता चला है कि बड़े प्रदर्शन अंतर केवल .NET ढांचे का x64 संस्करण पर होता है। फ्रेमवर्क के 32 बिट संस्करण के साथ समान गति पर चलाने के लिए लगता है (वास्तव में ऐसा लगता है कि इसमें शामिल संस्करण के साथ कुछ परीक्षण रनों में धीमी गति से चलती है) फ्रेमवर्क के एक्स 64 संस्करणों पर, इसमें वाला संस्करण लगता है लगभग 15% तेजी से चलाएं।
32 बिट परीक्षण के लिए, क्या आपने इसे 32 बिट मशीन पर, वर्चुअल मशीन में चलाया था, या संकलन के लिए x86 लक्ष्य निर्दिष्ट करके और WOW64 के तहत 32 बिट फ्रेमवर्क को चलाकर? मुझे नहीं पता कि इससे कोई फर्क पड़ता है, लेकिन यह संभव है। –
मैंने एक वीएम –
में अपना 32 बिट परीक्षण किया है क्या आपने परीक्षण को जोड़ने के ऊपर जोड़े को जोड़ने और फिर समय को मापने की कोशिश की है? आप पाएंगे कि अंतर नगण्य है .. – Baz1nga