अपने प्रदर्शन को बेहतर बनाने के लिए, मैं 20ms की न्यूनतम नमूना अवधि का उपयोग करके, VisualVM नमूने के साथ अपने अनुप्रयोगों में से एक को प्रोफाइल कर रहा हूं। प्रोफाइलर के अनुसार, मुख्य धागा DecimalFormat.format()
विधि में अपने CPU समय का लगभग एक चौथाई खर्च करता है।DecimalFormat.format() के लिए एक तेज विकल्प?
मैं 0.000000
के साथ double
संख्याओं को "छह" अंकों के साथ एक स्ट्रिंग प्रतिनिधित्व के लिए "रूपांतरित" करने के लिए पैटर्न का उपयोग कर रहा हूं। मुझे पता है कि यह विधि अपेक्षाकृत महंगी है और कई बार बुलाया गया है, लेकिन मैं अभी भी इन परिणामों से कुछ हद तक आश्चर्यचकित था।
ऐसे नमूने प्रोफाइलर के परिणाम किस डिग्री के लिए सटीक हैं? मैं उन्हें सत्यापित करने के बारे में कैसे जाउंगा - प्राथमिक रूप से एक उपकरण प्रोफाइलर का उपयोग किए बिना?
क्या मेरे उपयोग के मामले में
DecimalFormat
का कोई तेज़ विकल्प है? क्या यह मेरेNumberFormat
सबक्लास को रोल करने के लिए समझ में आता है?
अद्यतन:
DecimalFormat.format()
:: एकलDecimalFormat
वस्तु पुन: उपयोग किया कई बारमैं निम्नलिखित तीन तरीकों के प्रदर्शन की तुलना एक माइक्रो बेंचमार्क बनाया।
String.format()
: एकाधिक स्वतंत्र कॉल। आंतरिक रूप से इस विधि कोpublic static String format(String format, Object ... args) { return new Formatter().format(format, args).toString(); }
इसलिए मैं अपने प्रदर्शन बहुत
Formatter.format()
के समान होने की उम्मीद निर्भर करता है।Formatter.format()
: सिंगलFormatter
ऑब्जेक्ट कई बार पुन: उपयोग किया गया।इस विधि थोड़ा अजीब है -
Formatter
वस्तुओं डिफ़ॉल्ट निर्माता के साथ बनाई गई एक आंतरिकStringBuilder
वस्तु है, जो ठीक से पहुंच योग्य नहीं हैformat()
विधि द्वारा बनाई गई सभी स्ट्रिंग्स संलग्न करें और इसलिए साफ़ नहीं किया जा सकता है। नतीजतन,format()
पर कई कॉल सभी परिणामी तारों के बनाएंगे।इस समस्या के आसपास काम करने के लिए, मैंने अपना खुद का
StringBuilder
उदाहरण प्रदान किया है जिसे मैंनेsetLength(0)
कॉल के उपयोग से पहले साफ़ कर दिया था।
परिणाम जहां दिलचस्प:
DecimalFormat.format()
प्रति कॉल 1.4us पर आधारभूत था।String.format()
प्रति कॉल 2.7us पर दो के कारक से धीमा था।Formatter.format()
2.5us प्रति कॉल पर दो के कारक द्वारा भी धीमा था।
अभी यह लगता है कि DecimalFormat.format()
अभी भी इन विकल्पों में सबसे तेज़ है।
+1 मैं खुद कुछ लिखने वाला था - कोड का यह टुकड़ा एक अच्छा प्रारंभिक बिंदु हो सकता है। – thkala
मैंने अंत में अपने स्वयं के एल्गोरिदम का उपयोग करके एक फॉर्मेटर लिखा और यह मुझे आवश्यक कार्यक्षमता सबसेट के लिए 'दशमलव Format' से लगभग चार गुना तेज है। मेरा मानना है कि अभी भी सुधार के लिए जगह है, क्योंकि मैं वास्तव में व्यक्तिगत अंकों को जोड़ने के स्तर पर नहीं गया था। मैं इस जवाब को स्वीकार करूंगा क्योंकि यह एकमात्र ऐसा है जिसमें उपयोग करने योग्य कोड शामिल है। – thkala
ग्रेट जॉब पीटर। मैंने तेज़ 'डबल' बनाने के लिए अपना कोड दोबारा उपयोग किया है और यहां तक कि तेज़ 'स्ट्रिंग' (डबल वैल्यू) फॉर्मेटर भी बंद कर दिया है। – dantuch