तो मेरे पास यह जावा प्रोग्राम है जिसका उपयोग मैं डेटा के कई टेराबाइट्स के माध्यम से करने के लिए करता हूं। प्रदर्शन एक चिंता है।जावा में कुशल स्ट्रोड?
मैं एप्लिकेशन प्रोफाइल है, और सभी स्मृति आवंटन के एक बड़े अंश के साथ ही CPU समय के एक बड़े अंश एक साधारण कार्य को करते से आते हैं:
मैं ASCII वर्ण की एक सरणी है। मुझे पता है कि ऑफसेट i
के ऑफसेट j
ऑफसेट करने के लिए एक फ़्लोटिंग-पॉइंट नंबर का प्रतिनिधित्व करते हैं। मुझे उस फ़्लोटिंग-पॉइंट नंबर को double
में निकालने की आवश्यकता है।
बेवकूफ Double.parseDouble(new String(buf, i, j - i))
नौकरी करता है। हालांकि, इस जहां में बहुत समय खर्च किया जाता है और स्मृति आवंटन का एक बहुत से आते हैं, शायद इसलिए कि:
new String()
एक नई वस्तु बनाता है, बनाता है एक आंतरिकchar[]
सरणी और प्रतियां सरणी में पात्रों;Double.parseDouble()
एकFloatingDecimal
वस्तु बनाता है, और भी एकchar[]
सरणी, भी इसे में पात्रों को कॉपी बनाता है।
ये सभी आवंटन और यह सभी प्रतिलिपि वास्तव में आवश्यक नहीं हैं। क्या मैं उनसे बच सकता हूं?
मैं वास्तव में क्या चाहते चाहते एक strtod
की तरह समारोह है कि एक char[]
(या एक byte[]
) के साथ ही प्रारंभ/समाप्ति ऑफसेट ले जाएगा, और एक double
वापसी है।
कोई सुझाव? क्या मुझे अपना खुद का रोल करना चाहिए? क्या मुझे strtod
के आसपास जेएनआई रैपर लिखना चाहिए? क्या मुझे कुछ जावा लाइब्रेरी का उपयोग करना चाहिए जो पहले से ही बाहर है?
वास्तव में, String.substring विधि नकल नहीं करता है प्रारंभिक सरणी स्ट्रिंग कन्स्ट्रक्टर एक बाधा है तो यह उपयोगी हो सकता है। –