मैं इस परीक्षण किया गया है, और वहाँ एक प्रमुख संभावित वापसी जो अभी तक यहाँ वर्णित नहीं किया गया है: आप rounding tie-breaking विधि बदल रहे हैं।
Math.round()
"राउंड आधे अप" नियम लागू करता है, जबकि आपकी round()
विधि "शून्य से आधा दूर" नियम लागू करती है।
उदाहरण के लिए:
Math.round(-0.5d)
=>0L
Your.round(-0.5d)
=>-1L
यह कर सकते हैं या आप के लिए एक समस्या नहीं हो सकता है, लेकिन आप को समझना चाहिए उपरोक्त विधि यह है कि Math.round()
के लिए ड्रॉप-इन प्रतिस्थापन नहीं, NaN और अनंतता के विचारों के बाद भी पहले से ही रेखांकित किया गया है।
एक और प्रासंगिक सवाल: Rounding negative numbers in Java
प्रदर्शन का सवाल है, इसमें कोई शक नहीं है कि उपरोक्त विधि काफी तेजी Math.round()
से है - यह बेतरतीब ढंग से उत्पन्न धनात्मक और ऋणात्मक मानों के लिए समय का लगभग 35% में चलता है। इस विधि को एक तंग लूप में कॉल करते समय यह एक सार्थक अनुकूलन हो सकता है। यह branch prediction का उपयोग कर सीपीयू की वजह से केवल सकारात्मक मान दिए जाने पर भी बेहतर (25% रनटाइम) बेहतर होता है।
Math.round()
अंततः एक देशी JNI कॉल, जो प्रदर्शन अंतर का कारण हो सकता है द्वारा कार्यान्वित किया जाता। This Sun/Oracle bug बताता है कि j6u22 में शुद्ध-जावा संस्करण हो सकता है, लेकिन मैं j6u23 में कहां देख सकता हूं, और वास्तव में Math.round()
मेरे परीक्षणों में j6u16 के समान प्रदर्शन करता है। मैंने अन्य संस्करणों पर परीक्षण नहीं किया है।
स्रोत
2012-07-04 12:24:26
@TrueWill: यदि यह ठीक से नामित एक फ़ंक्शन में अच्छी तरह से है ... क्या यह वाकई मायने रखता है? शायद यह गणित-गहन कार्यक्रम में उपयोग किया जा रहा है। – Sivvy
यह दुर्लभ होगा कि आपको 1 से आसपास की विधि के लिए कुछ करने का एक तेज़ तरीका मिल जाएगा।0 मूल विधि के साथ 100% स्थिरता बनाए रखते हुए। – TofuBeer
बिल्कुल एक माइक्रो-अनुकूलन है, और स्थानीय अर्थ में इसके लायक था। - लेकिन इन्हें सामान्य उपयोग के लिए अनुशंसित नहीं किया जाता है। – mrjbq7