System.currentTimeMillis () बनाम नई तिथि () बनाम Calendar.getInstance ()। GetTime ()


239

जावा में, उपयोग करने के प्रदर्शन और संसाधन निहितार्थ क्या हैं

System.currentTimeMillis() 

बनाम

new Date() 

बनाम

Calendar.getInstance().getTime()

जैसा कि मैं इसे समझता हूं, System.currentTimeMillis()सबसे कुशल है। हालाँकि, अधिकांश अनुप्रयोगों में, मानव के लिए कुछ भी सार्थक करने के लिए उस लंबे मूल्य को एक तिथि या किसी समान वस्तु में बदलना होगा।

जवाबों:


242

System.currentTimeMillis()स्पष्ट रूप से सबसे कुशल है क्योंकि यह एक वस्तु भी नहीं बनाता है, लेकिन new Date()वास्तव में एक लंबे समय के बारे में सिर्फ एक पतली आवरण है, इसलिए यह बहुत पीछे नहीं है। Calendarदूसरी ओर, अपेक्षाकृत धीमी और बहुत जटिल है, क्योंकि इसे काफी जटिलता और सभी विषमताओं से निपटना पड़ता है जो तारीखों और समय (लीप वर्ष, दिन की बचत, टाइमज़ोन, आदि) से निहित हैं।

यह आमतौर पर Dateआपके आवेदन के भीतर केवल लंबे टाइमस्टैम्प या वस्तुओं से निपटने के लिए एक अच्छा विचार है , और केवल Calendarतब उपयोग करें जब आपको वास्तव में दिनांक / समय की गणना करने की आवश्यकता हो, या उपयोगकर्ता को उन्हें प्रदर्शित करने के लिए तिथियों को प्रारूपित करने की आवश्यकता हो। यदि आपको बहुत कुछ करना है, तो क्लीनर इंटरफ़ेस और बेहतर प्रदर्शन के लिए, Joda Time का उपयोग करना शायद एक अच्छा विचार है।


2
टाइमस्टैम्प और करंटमिल्स में क्या अंतर है?
पिंकपैंथर

1
@pinkpanther: "टाइमस्टैम्प" का उपयोग आम तौर पर एक पूर्णांक / लंबे समय तक वर्णन करने के लिए किया जाता है, जो एक ऐसे समय में एक बिंदु का वर्णन करता है जब एक "युग प्रारंभ" के बाद से सेकंड या मिलीसेकंड के रूप में व्याख्या की जाती है। दूसरे शब्दों में, currentTimeMillis () एक टाइमस्टैम्प लौटाता है।
माइकल बोरगवर्ड

43

JDK को देखते हुए, इसके लिए अंतरतम निर्माणकर्ता Calendar.getInstance()है:

public GregorianCalendar(TimeZone zone, Locale aLocale) {
    super(zone, aLocale);
    gdate = (BaseCalendar.Date) gcal.newCalendarDate(zone);
    setTimeInMillis(System.currentTimeMillis());
}

इसलिए यह पहले से ही स्वचालित रूप से वही करता है जो आप सुझाते हैं। दिनांक का डिफ़ॉल्ट निर्माता इसे रखता है:

public Date() {
    this(System.currentTimeMillis());
}

इसलिए वास्तव में विशेष रूप से सिस्टम समय प्राप्त करने की आवश्यकता नहीं है जब तक कि आप इसके साथ अपना कैलेंडर / दिनांक ऑब्जेक्ट बनाने से पहले इसके साथ कुछ गणित नहीं करना चाहते। इसके अलावा, मुझे जावा के स्वयं के कैलेंडर / तिथि वर्गों के प्रतिस्थापन के रूप में उपयोग करने के लिए joda-time की सिफारिश करनी होगी यदि आपका उद्देश्य दिनांक गणनाओं के साथ काम करना है।


22

यदि आप एक तारीख का उपयोग कर रहे हैं तो मैं दृढ़ता से सलाह देता हूं कि आप jodatime, http://joda-time.sourceforge.net/ का उपयोग करें । का उपयोग करते हुएSystem.currentTimeMillis() फ़ील्ड के लिए कर रहे हैं एक बहुत बुरा विचार की तरह लगता है तारीखों क्योंकि आप बेकार कोड का एक बहुत कुछ के साथ खत्म हो जाएगा।

तिथि और कैलेंडर दोनों ही गंभीर रूप से प्रभावित हैं, और कैलेंडर निश्चित रूप से उन सभी का सबसे खराब प्रदर्शन है।

मैं आपको सलाह देना चाहता हूं कि System.currentTimeMillis()जब आप वास्तव में मिलीसेकंड के साथ काम कर रहे हों, उदाहरण के लिए

 long start = System.currentTimeMillis();
    .... do something ...
 long elapsed = System.currentTimeMillis() -start;

28
मैं इस पर टिप्पणी करना चाहता था क्योंकि आपका उदाहरण उन चीजों में से एक है, जिनके लिए आपको System.currentTimeMillis () का उपयोग नहीं करना चाहिए ; यह एक मोनोटोनिक क्लॉक स्रोत नहीं है, इसलिए आप इसके साथ बीते हुए समय की मज़बूती से गणना नहीं कर सकते। यदि सिस्टम क्लॉक को बदला जाता है जबकि आपके द्वारा कोड किए जा रहे कोड निष्पादित हो रहे हैं, तो आपको अजीब (जैसे नकारात्मक) परिणाम मिलेंगे। जगह उपयोग System.nanoTime (), जिसमें है monotonic यदि अंतर्निहित प्रणाली का समर्थन करता है इस तरह के एक घड़ी स्रोत (देखें bugs.java.com/bugdatabase/view_bug.do?bug_id=6458294 )
रेम

System.currentTimeMillis स्वयं समय क्षेत्र से प्रभावित नहीं होता है। बदल रहा है सिस्टम का समय System.currentTimeMillis के रूप में एक ही तरीके से System.nanotime को प्रभावित करेगा
विक्टर

12

मैं System.currentTimeMillis()सभी प्रकार की गणनाओं के लिए दिए गए मूल्य का उपयोग करना पसंद करता हूं और केवल उपयोग करता हूं Calendarया Dateअगर मुझे वास्तव में मनुष्यों द्वारा पढ़ा जाने वाला मूल्य प्रदर्शित करने की आवश्यकता है। यह आपके दिन के उजाले की बचत करने वाले समय के 99% को भी रोकेगा। :)


12

अपनी मशीन पर मैंने इसे जांचने की कोशिश की। मेरा परिणाम:

Calendar.getInstance ()। GetTime () (* 1000000 बार) = 402ms
नई तिथि ()। getTime (); (* 1000000 बार) = 18ms
System.currentTimeMillis () (* 1000000 बार) = 16ms

GC के बारे में मत भूलना (यदि आप उपयोग करते हैं Calendar.getInstance()या new Date())


1
आश्चर्य है कि अगर कई धागे अन्य प्रसंस्करण के बीच एक ही कॉल करते हैं तो कोई अंतर होगा
tgkprog

7

आपके आवेदन के आधार पर, आप System.nanoTime()इसके बजाय उपयोग करने पर विचार कर सकते हैं ।


क्यों, उनका सवाल संसाधनों और प्रदर्शन के बारे में था, नैनो टाइम () अधिक संसाधनों का उपयोग करता है
वोल्फमैनड्रेगन

मैंने इसका उल्लेख किया क्योंकि यह एक विकल्प है जिसे किसी और ने सुझाव नहीं दिया है। पोस्टर में एक मंच नहीं था। SDN बग 6876279 से पता चलता है कि currentTimeMillis () और nanoTime () कुछ JKK संस्करणों में समान हैं। पोस्टर ने उनकी सटीकता की आवश्यकताओं को भी निर्दिष्ट नहीं किया है, जिसके लिए मूल सूची अपर्याप्त हो सकती है।
मायकेनैक

4
यह देर से हो सकता है, प्रश्न के सभी उदाहरणों में इस बात की पूर्ण धारणा है कि यह किस समय है। यूनिक्स युग की शुरुआत के बाद से 1,348,770,313,071 मिली। जो समय nanoTimeरिटर्न करता है वह सापेक्ष है (आमतौर पर कार्यक्रम की शुरुआत के लिए) और यह बकवास होगा यदि आपने इसे तारीख में बदलने की कोशिश की।
टिब्बा

हां, लेकिन आप प्रोग्राम स्टार्ट पर कुछ स्टैटिक कोड में currentTimeilli और नैनो को स्टोर कर सकते हैं, तो ऑफसेट के रूप में उन का उपयोग मिलि से एक सटीक नैनो प्राप्त करने के लिए डबल var = currentTimeStart - nanoTimeStart + nanoTimeNow
tgkprog

3

मैंने यह कोशिश की:

        long now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            new Date().getTime();
        }
        long result = System.currentTimeMillis() - now;

        System.out.println("Date(): " + result);

        now = System.currentTimeMillis();
        for (int i = 0; i < 10000000; i++) {
            System.currentTimeMillis();
        }
        result = System.currentTimeMillis() - now;

        System.out.println("currentTimeMillis(): " + result);

और परिणाम था:

दिनांक (): 199

currentTimeMillis (): 3


4
यह एक माइक्रो बेंचमार्क है और आपको प्राप्त परिणामों पर भरोसा करने के लिए सावधान रहना चाहिए। पर एक नज़र डालें stackoverflow.com/questions/504103/...
एक्सल

1
यह बेंचमार्क महत्वपूर्ण या बेहतर नहीं है, यह दर्शाता है कि जावा के तहत ऑपरेटिंग सिस्टम मायने रखता है। मैंने एक ही बेंचमार्क एक दर्जन बार ("अब" और "परिणाम" लूप से बाहर निकलते हुए) को चलाया, और मेरे प्रत्येक रन पर प्यारा अंतर था: दिनांक (): 322 से 330; currentTimeMillis (): 319 से 322. कुछ अन्य रनों पर मुझे दिनांक (): 312 से 318; currentTimeMillis (): 324 से 335. तो, IMHO वे वास्तविक मामलों पर (तारीख के स्रोत को देखते हुए) काफी समकक्ष हैं। JFYI, मैंने Ubuntu पर Java7 का उपयोग किया।
संपाि

0

System.currentTimeMillis() स्पष्ट रूप से सबसे तेज़ है क्योंकि यह केवल एक विधि कॉल है और कचरा कलेक्टर की आवश्यकता नहीं है।


14
आपके उत्तर का कोई मूल्य नहीं है क्योंकि यह पहले से स्वीकृत उत्तर का एक सबसेट है। आपको इस तरीके से जवाब न देने की कोशिश करनी चाहिए, खासकर पहले से मौजूद गुणवत्ता के जवाब के साथ यह बहुत पुराना सवाल नहीं है।
निकलैस गेंज इरिक्सन

1
दूसरे, ईडन अंतरिक्ष में वैसे भी शॉर्ट टर्म ऑब्जेक्ट के लिए कचरा कलेक्टर की आवश्यकता नहीं है।
नील्स बेच नील्सन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.