जिज्ञासा और दक्षता इस प्रश्न के कारण हैं। मैं एक स्थिति में हूँ जहाँ मैं कई नए HashSets बनाने रहा हूँ के बाद कुछ छोरों चलाएँ:एक हैशसेट बनाम एक साफ़ हैशसेट बनाम मेमोरी प्रभावशीलता
HashSet वर्तमान वर्ग के शीर्ष पर इस तरह के रूप में घोषित किया जाता है: बाद में कोड में फिर
private Set<String> failedTests;
, मैं सिर्फ जब भी मैं परीक्षण फिर से चला रहा हूँ एक नया failedTests HashSet बनाएँ:
failedTests = new HashSet<String>(16384);
मैं इस अधिक से अधिक करते हैं, परीक्षण के आकार के आधार। मैं कचरा कलेक्टर को पुराने डेटा को सबसे कुशलतापूर्वक संभालने की अपेक्षा करता हूं। लेकिन, मैं जानता हूँ कि एक और विकल्प शुरुआत में शुरू में HashSet बनाने के लिए होगा:
private Set<String> failedTests = new HashSet<String>(16384);
और फिर पाश के माध्यम से HashSet हर बार साफ़ करें।
failedTests.clear();
मेरा प्रश्न यह है कि ओवरहेड आदि के मामले में ऐसा करने का सबसे प्रभावी तरीका कौन सा है? मुझे नहीं पता कि स्पष्ट() फ़ंक्शन क्या कर रहा है - क्या यह वही काम कर रहा है, पुराने डेटा को कचरा संग्रह में भेज रहा है, या यह कुछ और अधिक कुशल कर रहा है? इसके अलावा, मैं हैशसेट को प्रारंभिक क्षमता का एक बड़ा कुशन दे रहा हूं, लेकिन यदि किसी परीक्षण के लिए 2^14 तत्वों की आवश्यकता होती है, तो .clear()
फ़ंक्शन हैशसेट को 16384 पर फिर से चालू करेगा?
जोड़ने के लिए, मुझे source code to clear() here मिला। तो यह कम से कम एक ओ (एन) ऑपरेशन सबसे खराब मामले है।
स्पष्ट फ़ंक्शन का उपयोग करके, मैंने एक परीक्षण प्रक्रिया की जो 565 सेकंड में समाप्त हुआ। इसे संभालने के लिए जीसी का उपयोग करके, परीक्षण 506 सेकंड में समाप्त हुआ।
लेकिन यह एक आदर्श बेंचमार्क नहीं है क्योंकि कंप्यूटर और नेटवर्क की फाइल सिस्टम के साथ इंटरफेसिंग जैसे अन्य बाहरी कारक हैं। लेकिन एक पूर्ण मिनट वास्तव में बहुत अच्छा महसूस करता है। क्या कोई एक विशिष्ट प्रोफाइलिंग सिस्टम की सिफारिश करता है जो लाइन/विधि स्तर पर काम करेगा? (मैं ग्रहण इंडिगो उपयोग कर रहा हूँ)
क्या आपने इसे बेंचमार्क करने का प्रयास किया है? – rob
क्या आपके पास कोई उपाय है कि आप * कितने * नए सेट बना रहे हैं? क्या आपने वास्तव में अपने आवेदन के व्यवहार का परीक्षण किया था? यह * स्मृति बनाम प्रदर्शन * प्रश्न का मामला है जो अक्सर समय से पहले अनुकूलन की ओर जाता है। आधार के रूप में आप एक नया 'हैशसेट' बना सकते हैं, जीसी को अपना काम करने की अनुमति दे सकते हैं और चिंता से पहले वास्तविक समय देखने के लिए थोड़ा प्रोफाइलिंग कर सकते हैं। आखिरकार, 'स्पष्ट' विधि में पुनरावृत्ति, संदर्भों को रद्द करने और जीसी को अपना काम करने की अनुमति देने की अनुमति शामिल है। – Gamb
संभावित डुप्लिकेट [लूप में ArrayList को फिर से बनाने के लिए सबसे तेज़ तरीका] (http://stackoverflow.com/questions/11740013/fastest-way-to-recreate-the-arraylist-in-a-for-loop): 'नया' आम तौर पर 'स्पष्ट' से तेज है। – assylias