2013-03-23 8 views
12

मैं उत्सुक था कि जावा के वर्ग और डबल के लिए आदिम प्रकार के बीच प्रदर्शन अंतर क्या था। इसलिए मैंने थोड़ा बेंचमार्क बनाया और कक्षा के प्रकार को 3x-7x धीमी गति से प्राप्त किया।जावा डबल बनाम डबल: क्लास टाइप बनाम आदिम प्रकार

class Main { 
    public static void main(String args[]) { 
     long bigDTime, littleDTime; 

     { 
      long start = System.nanoTime(); 
      Double d = 0.0; 
      for (Double i = 0.0; i < 1432143.341; i += 0.1) { 
       d += i; 
      } 
      long end = System.nanoTime(); 
      bigDTime = end - start; 
      System.out.println(bigDTime); 
     } 

     { 
      long start = System.nanoTime(); 
      double d = 0.0; 
      for (double i = 0.0; i < 1432143.341; i += 0.1) { 
       d += i; 
      } 
      long end = System.nanoTime(); 
      littleDTime = end - start; 
      System.out.println(littleDTime); 
     } 

     System.out.println("D/d = " + (bigDTime/littleDTime)); 
    } 
} 

http://ideone.com/fDizDu

तो क्यों डबल प्रकार तो बहुत धीमी है: (पर स्थानीय मशीन OSX, 7x 3x ideone पर)

यहाँ परीक्षण है? गणितीय ऑपरेटरों को अनुमति देने के लिए इसे क्यों लागू किया गया है?

+1

यह बॉक्स और अनबॉक्स की आवश्यकता के कारण धीमा है। यह व्यवहार की उम्मीद है। –

+0

@ होवरक्राफ्टफुलऑफेल जो समझ में आता है लेकिन यह अभी भी बहुत अधिक ओवरहेड जैसा लगता है। –

+1

यह बहुत अधिक ओवरहेड है। और इसी कारण से आपको महत्वपूर्ण कोड में आदिम रैपर प्रकारों के उपयोग से बचना चाहिए। –

उत्तर

17

तो डबल प्रकार इतना धीमा क्यों है?

क्योंकि मूल्य एक वस्तु जो आवंटन, आवंटन रद्द करने, स्मृति प्रबंधन के साथ साथ getters और setters की जरूरत है अंदर लपेटा जाता है

क्यों यह और भी गणितीय ऑपरेटर अनुमति देने के लिए लागू किया गया है?

क्योंकि ऑटोबॉक्स का मतलब है कि आप इस तरह के रैपर का उपयोग करने के लिए इस तथ्य के बारे में चिंता किए बिना हैं कि वे सादे मूल्य नहीं हैं। क्या आप ArrayList<Double> प्राप्त करने में सक्षम नहीं होना चाहते हैं? प्रदर्शन हमेशा आवश्यक नहीं है और परिस्थितियों के अनुसार प्रदर्शन के 3x-7x की बूंद शायद स्वीकार्य है। अनुकूलन एक आवश्यकता है जो हमेशा मौजूद नहीं होती है।

यह हर स्थिति में सच है, LinkedList का उपयोग करके यादृच्छिक अभिगम तत्व अधिक हो सकते हैं लेकिन इसका मतलब यह नहीं है कि LinkedList बिल्कुल लागू नहीं किया जाना चाहिए। इसका न तो मतलब है कि कुछ यादृच्छिक अभिगमों के लिए एक लिंक्ड सूची का उपयोग करके प्रदर्शन में हस्तक्षेप हो सकता है।

अंतिम नोट: आपको ऐसी चीजों को बेंचमार्क करने से पहले वीएम को गर्म करना चाहिए।

3

Double एक बॉक्स double है। इस प्रकार सामान्य रूप से संकलित कोड को इसके साथ कुछ भी करने से पहले Double को शून्य के लिए जांचना होता है। यह निश्चित रूप से कुछ भी करने से धीमा है।

Double (और प्राइमेटिव के अन्य बॉक्स किए गए संस्करण) उपयोगी हैं क्योंकि यह Object है। यह आपको उन कार्यों के आस-पास पारित करने की अनुमति देता है जो Object लेते हैं, और इसे कहीं और Double पर वापस डालें। अधिक उपयोगी बात यह है कि यह सामान्य प्रकारों को इसमें शामिल करने की अनुमति देता है: एक सामान्य प्रकार में double या कोई अन्य आदिम नहीं हो सकता है, लेकिन इसमें Double हो सकता है।

8

आप सामान्य रूप से उपयोग नहीं होता Double, Integer, आदि (कभी कभी Integer आदि एक 'वैकल्पिक' मान संग्रहीत करने के लिए उपयोगी हो सकता है -। आप इसे null कभी कभी होने के लिए चाहते हो सकता है इस के साथ Double क्योंकि NaN है कम होने की संभावना है उन लोगों के लिए उपलब्ध।)

कारण Double इस प्रकार मौजूद है। जावा में दो मुख्य प्रकार के मान होते हैं: ऑब्जेक्ट्स (अनिवार्य रूप से अंकगणितीय के बिना सी/सी ++ पॉइंटर्स की तरह), और आदिम मान (उदा। double)।ArrayList जैसी कक्षाओं को Object स्वीकार करने के लिए परिभाषित किया जा सकता है, जो उपयोगकर्ताओं को String, File या जो भी उन्हें पसंद है उसे स्टोर करने की अनुमति देता है - लेकिन double जैसे आदिम मान इस तरह की परिभाषा से ढके नहीं हैं। इसलिए जैसी कक्षाएं ArrayList जैसे एस स्टोर करने के लिए ArrayList के लेखकों की आवश्यकता के बिना सभी आदिम प्रकारों के लिए विशेष संस्करण बनाने के लिए आसान बनाने के लिए मौजूद हैं।

संबंधित मुद्दे