সিস্টেম.কন্ট্রেনটাইমমিলিস () বনাম নতুন তারিখ () বনাম ক্যালেন্ডার.সেট ইনসটেন্স ()। গেটটাইম ()


239

জাভাতে, ব্যবহারের কর্মক্ষমতা এবং সংস্থানগুলি কী কী তা বোঝায়

System.currentTimeMillis() 

বনাম

new Date() 

বনাম

Calendar.getInstance().getTime()

আমি এটি বুঝতে হিসাবে, System.currentTimeMillis()সবচেয়ে দক্ষ। যাইহোক, বেশিরভাগ অ্যাপ্লিকেশনগুলিতে, সেই দীর্ঘ মানটি মানুষের কাছে অর্থবহ কিছু করার জন্য একটি তারিখ বা অনুরূপ কিছুতে রূপান্তর করা দরকার।

উত্তর:


242

System.currentTimeMillis()স্পষ্টতই এটি সর্বাধিক দক্ষ যেহেতু এটি কোনও বস্তু তৈরি করে না, তবে new Date()এটি একটি দীর্ঘ সম্পর্কে প্রায় একটি পাতলা মোড়ক, তাই এটি খুব বেশি পিছনে নেই। Calendarঅন্যদিকে, তুলনামূলকভাবে ধীর এবং খুব জটিল, যেহেতু এটি যথেষ্ট জটিলতা এবং তারিখ এবং সময়গুলির অন্তর্নিহিত সমস্ত প্রতিকূলতার সাথে লড়াই করতে হয়েছে (লিপ বছর, দিবালোকের সঞ্চয়, সময় অঞ্চল ইত্যাদি)।

সাধারণভাবে দীর্ঘ টাইমস্ট্যাম্প বা শুধুমাত্র মোকাবিলা করার জন্য একটি ভাল ধারণা Dateআপনার আবেদন মধ্যে বস্তু, এবং শুধুমাত্র ব্যবহার Calendarযখন আপনি আসলে তাদের ব্যবহারকারীকে প্রদর্শনের জন্য তারিখ / সময় গণনার, অথবা বিন্যাস তারিখ করতে হবে। আপনার যদি অনেক কিছু করতে হয় তবে ক্লিনার ইন্টারফেস এবং আরও ভাল পারফরম্যান্সের জন্য জোদা টাইম ব্যবহার করা সম্ভবত একটি ভাল ধারণা।


2
টাইমস্ট্যাম্প এবং কারেন্ট মিলিসের মধ্যে পার্থক্য কী?
গোলাপী প্যান্থার

1
@ পিংকপ্যান্থার: "টাইমস্ট্যাম্প" সাধারণত একটি পূর্ণসংখ্যার / দীর্ঘ বর্ণনা করতে ব্যবহৃত হয় যা "পর্বের শুরু" থেকে সেকেন্ড বা মিলিসেকেন্ড হিসাবে ব্যাখ্যা করার সময় সময়ে একটি বিন্দু বর্ণনা করে। অন্য কথায়, কারেন্টটাইমমিলিস () একটি টাইমস্ট্যাম্প দেয়।
মাইকেল বর্গওয়ার্ট

43

জেডিকে দিকে তাকানো, এর অন্তর্নিহিত নির্মাতাদের 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());
}

সুতরাং আপনার ক্যালেন্ডার / তারিখ অবজেক্টটি তৈরি করার আগে আপনি যদি এটির সাথে কিছু গণিত করতে না চান তবে বিশেষত সিস্টেমের সময় পাওয়ার দরকার নেই। এছাড়াও জাভা-র নিজস্ব ক্যালেন্ডার / তারিখের ক্লাসগুলির জন্য প্রতিস্থাপন হিসাবে জাডা-টাইম ব্যবহার করার পরামর্শ দিতে হবে যদি আপনার উদ্দেশ্য তারিখ গণনা দিয়ে অনেক কাজ করে।


22

আপনি যদি কোনও তারিখ ব্যবহার করছেন তবে আমি দৃ strongly়ভাবে পরামর্শ দিচ্ছি যে আপনি জোডাটাইম ব্যবহার করুন, http://joda-time.sourceforge.net/ । ব্যবহার System.currentTimeMillis()ক্ষেত্র যে জন্য হয় খুব খারাপ ধারণা মত তারিখগুলি শব্দসমূহ কারণ আপনার বেহুদা কোড অনেক দিয়ে শেষ করব।

তারিখ এবং ক্যালেন্ডার উভয়ই গুরুতরভাবে উদাসীন এবং ক্যালেন্ডার অবশ্যই তাদের সকলের মধ্যে সবচেয়ে খারাপ অভিনয়।

System.currentTimeMillis()উদাহরণস্বরূপ, আপনি যখন বাস্তবে মিলিসেকেন্ডের সাথে কাজ করছেন তখন আমি আপনাকে ব্যবহার করার পরামর্শ দেব

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

28
আমি এটিতে মন্তব্য করতে চেয়েছিলাম কারণ আপনার উদাহরণ হ'ল এমন একটি জিনিসের জন্য যা আপনি সিস্টেমের জন্য ব্যবহার না করা উচিত .c এটি কোনও একঘেয়ে ঘড়ির উত্স নয়, সুতরাং আপনি এটির সাথে নির্ভরযোগ্যভাবে সময় কাটাতে পারবেন না। আপনার টাইমিং কোডটি কার্যকর করার সময় যদি সিস্টেম ঘড়িটি পরিবর্তন করা হয় তবে আপনি অদ্ভুত (যেমন নেতিবাচক) ফলাফল পাবেন। উপকার ব্যবহার System.nanoTime (), যা হয় একঘেয়ে যদি অন্তর্নিহিত সিস্টেম সমর্থন যেমন একটি ঘড়ি উৎস (দেখুন bugs.java.com/bugdatabase/view_bug.do?bug_id=6458294 )
REM

সিস্টেম.র বর্তমান টাইমমিলিস নিজেই সময় অঞ্চল দ্বারা প্রভাবিত হয় না। সিস্টেমের সময় পরিবর্তনের ফলে সিস্টেম.নোটোটাইমকে একইভাবে প্রভাবিত করবে সিস্টেমকন্ট্রেন্টটাইমমিলিস
ভিক্টর

12

আমি System.currentTimeMillis()সমস্ত ধরণের গণনার জন্য প্রত্যাবর্তিত মানটি ব্যবহার করতে পছন্দ করি এবং কেবলমাত্র আমি ব্যবহার করতে পারি Calendarবা Dateযদি আমাকে সত্যিই এমন কোনও মান প্রদর্শন করতে হয় যা মানুষের দ্বারা পড়া হয়। এটি আপনার দিবালোক-সঞ্চয়-সময় বাগগুলির 99% প্রতিরোধ করবে। :)


12

আমার মেশিনে আমি এটি পরীক্ষা করার চেষ্টা করেছি। আমার ফলাফল:

ক্যালেন্ডার.জেটইনস্ট্যান্স ()। গেটটাইম () (* 1000000 বার) = 402 মিমি
নতুন তারিখ ()। গেটটাইম (); (* 1000000 বার) = 18 মিমি
সিস্টেম.কন্ট্রেন্টটাইমমিলিস () (* 1000000 বার) = 16 মিমি

জিসি সম্পর্কে ভুলবেন না (যদি আপনি ব্যবহার করেন Calendar.getInstance()বা new Date())


1
অন্যান্য প্রসেসিংয়ের মধ্যে অনেক থ্রেড একই কল করলে কোনও পার্থক্য হবে কিনা তা অবাক করে দেখুন
tgkprog

7

আপনার অ্যাপ্লিকেশন উপর নির্ভর করে, আপনি System.nanoTime()পরিবর্তে ব্যবহার বিবেচনা করতে পারেন ।


কেন, তাঁর প্রশ্ন সংস্থান এবং কর্মক্ষমতা সম্পর্কে ছিল, ন্যানোটাইম () আরও সংস্থান ব্যবহার করে
ওল্ফম্যানড্রেগন

আমি এটি উল্লেখ করেছি কারণ এটি এমন একটি বিকল্প যা অন্য কেউ প্রস্তাব করেনি। পোস্টারটিতে একটি প্ল্যাটফর্ম নির্দিষ্ট করা হয়নি। এসডিএন বাগ 6876279 পরামর্শ দেয় যে কিছু জেডিকে সংস্করণে কারেন্টটাইমমিলিস () এবং ন্যানোটাইম () একই ব্যবহার করে। পোস্টারটি তাদের নির্ভুলতার প্রয়োজনীয়তাও নির্দিষ্ট করে নি, যার জন্য মূল তালিকাটি অপর্যাপ্ত হতে পারে।
মেকেনেক

4
দেরীতে যেমন হতে পারে, প্রশ্নের সমস্ত উদাহরণের সময়টি কী তা সম্পর্কে পরম ধারণা রয়েছে। ইউনিক্স যুগের সূচনা থেকে 1,348,770,313,071 মিলি is যে সময়টি nanoTimeফিরে আসে তা আপেক্ষিক (সাধারণত প্রোগ্রামের সূচনার দিকে) এবং আপনি এটিকে তারিখে রূপান্তরিত করার চেষ্টা করলে বাজে কথা হবে।
ডুনস

হ্যাঁ তবে আপনি প্রোগ্রাম শুরুতে কিছু স্থিতিশীল কোডে কারেন্টটাইমিলি এবং ন্যানো সংরক্ষণ করতে পারেন, তারপরে মিলি থেকে ডাবল ভার = কারেন্টটাইমস্টার্ট - ন্যানোটাইমস্টার্ট + ন্যানোটাইমনিও ব্যবহার করে অফসেট হিসাবে সেগুলি ব্যবহার করুন
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

কারেন্টটাইমমিলিস (): 3


4
এটি একটি মাইক্রো মানদণ্ড এবং আপনার প্রাপ্ত ফলাফলের প্রতি আস্থা রাখতে আপনার সতর্ক হওয়া উচিত। কটাক্ষপাত আছে stackoverflow.com/questions/504103/...
এক্সেল

1
এই মানদণ্ডটি তাৎপর্যপূর্ণ বা তাত্পর্যপূর্ণ নয়, এটি দেখায় যে জাভার অধীনে অপারেটিং সিস্টেমটি গুরুত্বপূর্ণ। আমি একই বেঞ্চমার্কটি কয়েকবার লুপ ডজনে চালিয়েছি ("এখন" এবং "ফলাফল" লুপের বাইরে চলেছি) এবং প্রতিটি দৌড়ে আমার বেশ পার্থক্য ছিল: তারিখ (): 322 থেকে 330; কারেন্টটাইমমিলিস (): 319 থেকে 322. কিছু অন্যান্য রানে আমার তারিখ ছিল (): 312 থেকে 318; কারেন্টটাইমমিলিস (): 324 থেকে 335. সুতরাং, আইএমএইচও তারা বাস্তব ক্ষেত্রে (এছাড়াও তারিখের উত্সের দিকে তাকিয়ে থাকে) একদম সমতুল্য। জেএফওয়াই, আমি উবুন্টুতে জাভা 7 ব্যবহার করেছি।
সাম্পিসা

0

System.currentTimeMillis() স্পষ্টতই দ্রুততম কারণ এটি কেবলমাত্র একটি পদ্ধতি কল এবং কোনও আবর্জনা সংগ্রহকারী প্রয়োজন হয় না।


14
আপনার উত্তরটির কোনও মূল্য নেই কারণ এটি পূর্ব অনুমোদিত উত্তরের একটি উপসেট value আপনার এই পদ্ধতিতে উত্তর না দেওয়ার চেষ্টা করা উচিত, বিশেষত এটি ইতিমধ্যে বিদ্যমান মানের উত্তর সহ একটি পুরানো প্রশ্ন is
নিক্লাস জেনেজ এরিকসন

1
দ্বিতীয়ত, ইডেন স্পেসে যাইহোক স্বল্প মেয়াদী অবজেক্টগুলির জন্য আবর্জনা সংগ্রহকারী প্রয়োজন হয় না।
নীলস বেচ নিলসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.